dataLoadStorageFileFormatPandas - juedaiyuer/researchNote GitHub Wiki

#数据加载,存储与文件格式#

##读写文本格式的数据##

###pandas的解析函数###

read_csv		从文件,URL,文件型对象中加载带分隔符的数据。默认分隔符为逗号
read_table		从文件,URL,文件型对象中加载带分隔符的数据。默认分隔符为制表符"\t"
read_fwf		读取定宽列格式数据
read_clipboard	读取剪切板中的数据,在将网页转换为表格时很有用

###参数

path			表示文件系统位置,URL,文件型对象的字符串
sep,delimiter	行中各字段进行拆分的字符序列,正则表达式
header			用于列名的行号,默认为0-第一行,没有header行设置None
index_col		用于行索引的列编号或列名
names			用于结果的列名列表
skiprows		需要忽略的行数
na_values		一组用于替换NA的值
comment			将注释信息从行尾拆分出去的字符
parse_dates		数据解析为日期,默认False
keep_date_col	如果连接多列解析日期,则保持参与连接的列,默认False
converters		由列号/列名根函数之间的映射关系组成的字典,{'foo':f},foo列的所有值应用函数f
dayfirst		当解析有歧义的日期时,将其看做国际格式,默认False
date_parser		用于解析日期的函数
nrows			需要读取的行数
iterator		返回一个TextParser以便逐块读取文件
chunksize		文件块的大小
skip_footer		需要忽略的行数
verbose			打印各种解析器输出信息
encoding		用于unicode的文本编码格式
squeeze			如果数据经解析后仅含一列,则返回Series
thousands		千分位分隔符

###测试###

a,b,c,d,message
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo

>>> df=pd.read_csv('test/test.csv')
>>> 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,需要指定分隔符

>>> pd.read_table('test/test.csv',sep=',')
   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,hello
5,6,7,8,world
9,10,11,12,foo

pandas为其分配默认的列名

>>> df=pd.read_csv('test/test2.csv',header=None)
>>> df
   0   1   2   3      4
0  1   2   3   4  hello
1  5   6   7   8  world
2  9  10  11  12    foo

自定义列名

>>> df=pd.read_csv('test/test2.csv',names=['a','b','c','d','message'])
>>> df
   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的索引,index_col参数指定message

>>> names=['a','b','c','d','message']
>>> pd.read_csv('test/test2.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

如果将多个列做成一个层次化索引,只需要传入由列编号或列名组成的列表

key1,key2,value1,value2
one,a,1,2
one,b,3,4
one,c,5,6
one,d,7,8
two,a,9,10
two,b,11,12
two,c,13,14
two,d,15,16


>>> parsed=pd.read_csv('test/test3.csv',index_col=['key1','key2'])
>>> 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的分隔符

	 A           B            C
aaa -0.0715834   -0.57494471  0.72855709
bbb -0.96507724  1.16917368   0.85375937
ccc -0.89285266  -0.31767333  0.19935386
ddd  0.75722349  -1.0138757   -1.63183457


>>> list(open('test/test4.txt'))
['     A           B            C\n', 'aaa -0.0715834   -0.57494471  0.72855709\n', 'bbb -0.96507724  1.16917368   0.85375937\n', 'ccc -0.89285266  -0.31767333  0.19935386\n', 'ddd  0.75722349  -1.0138757   -1.63183457\n', '\n']


>>> result=pd.read_table('test/test4.txt',sep='\s+')
>>> result
	        A         B         C
aaa -0.071583 -0.574945  0.728557
bbb -0.965077  1.169174  0.853759
ccc -0.892853 -0.317673  0.199354
ddd  0.757223 -1.013876 -1.631835

解析器函数有许多参数可以帮助你处理各种各样的异形文件格式

skiprows设置跳过文件行数,pd.read_csv('test/test.csv',skiprows=[0,2,3])

####缺失值处理

标记:NA,-1,#IND,NULL

na_values可以接受一组用于表示缺失值的字符串,pd.read_csv('test/test.csv',na_values=['world'])

something,a,b,c,d,message
one,1,2,3,4,NA
two,5,6,7,8,world
three,9,10,11,12,foo

一个字典为各列指定不同的NA标记值

>>> sentinels={'message':['foo','NA'],'something':['two']}
>>> pd.read_csv('test/test5.csv',na_values=sentinels)
  something  a   b   c   d message
0       one  1   2   3   4     NaN
1       NaN  5   6   7   8   world
2     three  9  10  11  12     NaN

##逐块读取文本文件##

Page:179

##将数据写出到文本格式##

数据也可以输出为分隔符格式的文本

>>> data=pd.read_csv('test/test5.csv')
>>> data
  something  a   b   c   d message
0       one  1   2   3   4     NaN
1       two  5   6   7   8   world
2     three  9  10  11  12     foo

利用DataFrame的to_csv方法,可以将数据写到一个以逗号分割的文件中

>>> data.to_csv('test/out.csv')

直接写出到sys.stdout,仅仅是打印结果

>>> data.to_csv(sys.stdout,sep='|')

缺失值在输出结果中会被表示为空字符串,别的标记值

>>> data=pd.read_csv('test/out.csv',na_rep='NULL')

如果没有设置其它选项,则会写出行和列的标签,当然,它们也都可以被禁用

>>> data=pd.read_csv('test/out.csv',index=False,header=False)

只写出一部分的列,并以你指定的顺序排列

>>> data=pd.read_csv('test/out.csv',index=False,cols=['a','b','c'])

Series的to_csv方法

##手工处理分隔符格式

大部分存储在磁盘上的表格型数据都能用pandas.read_table进行加载

简单的CSV文件

"a","b","c"
"1","2","3"
"1","2","3","4"

对于任何单字符分隔符文件,可以直接使用Python内置的csv模块,将任意已打开的文件或文件型对象传给csv.reader

>>> import csv
>>> f=open('test/test6.csv')
>>> reader=csv.reader(f)
>>> for line in reader:
...     print line
... 
['a', 'b', 'c']
['1', '2', '3']
['1', '2', '3', '4']