文本格式数据的读写

表格型数据读取为DataFrame对象是pandas的重要特性,下表总结了部分函数

这些函数的可选参数主要有:

索引

可以将一或多个列作为返回的DataFrame,从文件或用户处获得列名

类型推断和数据转换

包括用户自定义的值转换和自定义的缺失值符号列表

日期时间解析

包括组合功能,也包括将分散在多个列上的日期和时间信息组合成结果中的单列

迭代

支持对大型文件的分块迭代

未清洗数据问题

跳过行、页脚、注释以及其他次要数据,比如逗号分隔千位的数字

这里我在本机的/Users/roarboil/Desktop/ 这一目录下存了一个csv文件如图:

我们使用Unix环境下的cat命令来查看该文件:

我们发现这个文件是由逗号分隔的,于是我们使用read_csv读入一个DataFrame

1
2
3
4
5
6
df = pd.read_csv('/Users/roarboil/Desktop/1.csv')
print(df) ==>
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo

如果本身没有列名,可以选择自动分配列名或手动指定:

1
2
3
4
5
6
7
8
9
10
11
12
df1 = pd.read_csv('/Users/roarboil/Desktop/1.csv' ,header=None)
print(df1) ==>
0 1 2 3 4
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
df2 = pd.read_csv('/Users/roarboil/Desktop/1.csv' ,names=['a','b','c','d','message'])
print(df2) ==>
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo

如果想要指定列作为返回DataFrame的索引,可以使用index_col方法(这里以message列作为索引为例)

1
2
3
4
5
6
7
df2 = pd.read_csv('/Users/roarboil/Desktop/1.csv' ,names=['a','b','c','d','message'],index_col='message')
print(df2) ==>
a b c d
message
hello 1 2 3 4
world 5 6 7 8
foo 9 10 11 12

如果想要形成一个分层索引,需要传入一个包含列序号或列名的列表

1
2
3
4
5
6
7
8
9
10
11
12
df = pd.read_csv('/Users/roarboil/Desktop/1.csv' ,index_col=['key1','key2'])
print(df) ==>
value1 value2
key1 key2
one a 1 2
b 3 4
c 5 6
d 7 8
two a 9 10
b 11 12
c 13 14
d 15 16

解析函数有很多附加函数来帮助处理各种各种异常文件格式,比如可以使用skiprows来跳行处理

可以使用na_values进行缺失值标识指定(也即人工指定进来什么数据表示该项数据缺失)

1
2
3
4
5
6
7
8
9
10
11
12
df = pd.read_csv('/Users/roarboil/Desktop/1.csv' ,index_col=['key1','key2'],na_values=['5'])
print(df) ==>
value1 value2
key1 key2
one a 1.0 2
b 3.0 4
c NaN 6
d 7.0 8
two a 9.0 10
b 11.0 12
c 13.0 14
d 15.0 16

分块读入文本文件

如果只想读取一小部分行可以知名nrows

为了分块读入文件,可以指定chunksize作为每一块的行数

read_csv返回的TextParser对象允许根据上面指定的chunksize来便利每一个数据块,下面的示例程序遍历文件并对列key聚合获得计数值

1
2
3
4
5
chunker = pd.read_csv('examples/ex6.csv',chunkersize=1000)
tot = pd.Series([])
for piece in chunker:
tot = tot.add(piece['key'].value_counts(), fill_value=0)
tot = tot.sort_values(ascending=False)

将数据写入文本格式

可以使用DataFrame的to_csv方法将数据导出为逗号分隔的文件

1
2
3
4
5
6
7
8
9
10
11
12
df = pd.read_csv('/Users/roarboil/Desktop/1.csv')
print(df) ==>
key1 key2 value1 value2
0 one a 1 2
1 one b 3 4
2 one c 5 6
3 one d 7 8
4 two a 9 10
5 two b 11 12
6 two c 13 14
7 two d 15 16
df.to_csv('/Users/roarboil/Desktop/2.csv')

也可以使用sep参数指定其他的分隔符

1
2
3
4
5
6
7
8
9
10
11
df = pd.read_csv('/Users/roarboil/Desktop/1.csv')
df.to_csv(sys.stdout,sep='|') ==>
|key1|key2|value1|value2
0|one|a|1|2
1|one|b|3|4
2|one|c|5|6
3|one|d|7|8
4|two|a|9|10
5|two|b|11|12
6|two|c|13|14
7|two|d|15|16

另外也可以使用na_rep对缺失值进行标注,用index=False和header=False来禁止写入行和列的标签

关于JSON数据和XML/HTML数据待用到时再作补充

Author: YihangBao
Link: https://roarboil.github.io/2019/09/13/textio/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.