1.读写文本格式的数据
pandas提供了一些将表格型数据读取为DataFrame对象的函数
大致介绍下这些函数在将文本数据转换为DataFrame时所用到的一些技术。这些函数的选项可以划分为以下几个大类
df=pd.read_csv('ex1.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
我们也可以用read_table,只不过需要指定分隔符
print pd.read_table('ex1.csv',sep=',')
并不是所有文件都有标题行,读入该文件的方法有2个。可以让pandas为其分配默认的列名,也可以自定义列名
print pd.read_csv('data/ex2.csv',header=None)
print pd.read_csv('data/ex2.csv',names=['a','b','c','d','message'])
结果为:
0 1 2 3 4
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
假设希望将message列做成DataFrame的索引。
names=['a','b','c','d','message']
print pd.read_csv('data/ex2.csv',names=names,index_col='message')
结果为:
a b c d
message
hello 1 2 3 4
world 5 6 7 8
foo 9 10 11 12
如果希望将多个列做成一个层次化索引,只需传入一个由列编号或列名组成的列表即可
parsed=pd.read_csv('data/csv_mindex.csv',index_col=['key1','key2'])
print parsed
结果为:
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
有些表格可能不是固定的分隔符去分隔字段的。对于这种情况,可以编写一个正则表达式来作为read_table的分隔符
result=pd.read_table('data/ex3.txt',sep='\s+')
print result
结果为:
A B C
aaa -0.264438 -1.026059 -0.619500
bbb 0.927272 0.302904 -0.032399
ccc -0.264273 -0.386314 -0.217601
ddd -0.871858 -0.348382 1.100491
这些解析器函数还有许多参数可以帮助你处理各种各样的异形文件格式。比如说,你可以用skiprows跳过文件的第一行、第三行和第四行
print pd.read_csv('data/ex4.csv',skiprows=[0,2,3])
结果为:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
缺失值处理是文件解析任务中的一个重要组成部分。默认情况下,pandas会用一组经常出现的标记值进行识别,如NA、-1.#IND以及NULL等
result2=pd.read_csv('data/ex5.csv')
print result2
print pd.isnull(result2)
结果为:
something a b c d message
0 one 1 2 3 4 NaN
1 two 5 6 NaN 8 world
2 three 9 10 11 12 foo
something a b c d message
0 False False False False False True
1 False False False True False False
2 False False False False False False
na_values可以接受一组用于表示缺失值的字符串
result3=pd.read_csv('data/ex5.csv',na_values=['NULL'])
print result3
结果为:
something a b c d message
0 one 1 2 3 4 NaN
1 two 5 6 NaN 8 world
2 three 9 10 11 12 foo
可以用一个字典为各列指定不同的NA标记值
sentinels={'message':['foo','NA'],'something':['two']}
print pd.read_csv('data/ex5.csv',na_values=sentinels)
结果为:
something a b c d message
0 one 1 2 3 4 NaN
1 NaN 5 6 NaN 8 world
2 three 9 10 11 12 NaN
2.逐块读取文本文件
result4=pd.read_csv('data/ex6.csv',nrows=5)
print result4
结果为:
one two three four key
0 0.467976 -0.038649 -0.295344 -1.824726 L
1 -0.358893 1.404453 0.704965 -0.200638 B
2 -0.501840 0.659254 -0.421691 -0.057688 G
3 0.204886 1.074134 1.388361 -0.982404 R
4 0.354628 -0.133116 0.283763 -0.837063 Q
要逐块读取文件,需要设置chunksize(行数)
chunker=pd.read_csv('data/ex6.csv',chunksize=1000)
print chunker
结果为:
<pandas.io.parsers.TextFileReader object at 0x00000000092BFC18>
read_csv所返回的这个TextParser对象使你可以根据chunksize对文件进行逐块迭代。比如,我们可以迭代处理ex6.csv,将值计数聚合到“key”列中
chunker=pd.read_csv('data/ex6.csv',chunksize=1000)
tot=Series([])
for piece in chunker:
tot=tot.add(piece['key'].value_counts(),fill_value=0)
tot=tot.order(ascending=False)
print tot[:10]
结果为:
E 368
X 364
L 346
O 343
Q 340
M 338
J 337
F 335
K 334
H 330
dtype: float64
TextParser还有一个get_chunk方法,它使你可以读取任意大小的块