pandas入门(6)——数据加载、存储与文件格式
输入输出通常可以划分为几个大类:读取文本文件和其他更高效的磁盘存储格式,加载数据库中的数据,利用Web API操作网络资源
一、读取文本格式数据
函数在将文本数据转换为DataFrame时会用到一些技术,这些函数的选项可以划分为:
- 索引:将一个或多个列当做返回的DataFrame处理,以及是否从文件、用户获取列名
- 类型推断和数据转换:包括用户定义值的转换、和自定义的缺失值标记列表等
- 日期解析:包括组合功能,比如将分散在多个列中的日期时间信息组合成结果中的单个列
- 迭代:支持对大文件进行逐块迭代
- 不规整数据问题:跳过一些行、页脚、注释或其他一些不重要的东西(比如由成千上万个逗号隔开的数值数据
备注:pandas文档有不同参数的例子,如果你感到阅读某个文件很难,可以通过相似的足够多的例子找到正确的参数
其中一些函数,比如pandas.read_csv,有类型推断功能,因为列数据的类型不属于数据类型。也就是说,你不需要指定列的类型到底是数值、整数、布尔值,还是字符串。其它的数据格式,如HDF5、Feather和msgpack,会在格式中存储数据类型
1、日期和其他自定义类型的处理
若文件以逗号分隔,可以使用read_csv将其读入一个DataFrame:
In [1]: df = pd.read_csv(''D:/python/学习笔记/examples/ex1.csv'')
#或pd.read_table('D:/python/学习笔记/examples/ex1.csv', sep=',')
In [2]: df
Out[2]:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
-
并不是所有文件都有标题行,读入这种文件的办法有两个:可以让pandas为其分配默认的列名,也可以自己定义列名,如
In [3]:pd.read_csv('D:/python/学习笔记/examples/ex2.csv',header=None) Out[3]: 0 1 2 3 4 0 1 2 3 4 hello 1 5 6 7 8 world 2 9 10 11 12 foo In [4]: pd.read_csv('D:/python/学习笔记/examples/ex2.csv',names= ['a','b','c','d','message']) Out[4]: 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的索引,可以明确表示要将该列放到索引4的位置上,也可以通过index_col参数指定"message":
In [5]: names = ['a', 'b', 'c', 'd', 'message'] In [6]: pd.read_csv('D:/python/学习笔记/examples/ex2.csv', names=names, index_col='message') Out[6]: a b c d message hello 1 2 3 4 world 5 6 7 8 foo 9 10 11 12
-
将多个列做成一个层次化索引,只需传入由列编号或列名组成的列表即可
In [7]: parsed=pd.read_csv('D:/python/学习笔记/examples/csv_mindex.csv',index_col=['key1','key2']) In [8]: parsed Out[8]: 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的分隔符。可以用正则表达式表达为\s+:
In [9]: list(open('examples/ex3.txt')) Out[9]: [' A B C\n', 'aaa -0.264438 -1.026059 -0.619500\n', 'bbb 0.927272 0.302904 -0.032399\n', 'ccc -0.264273 -0.386314 -0.217601\n', 'ddd -0.871858 -0.348382 1.100491\n'] In [10]: result=pd.read_table('D:/python/学习笔记/examples/ex3.txt',sep='\s+') In [11]: result Out[11]: 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
这里,由于列名比数据行的数量少,所以read_table推断第一列应该是DataFrame的索引
-
解析器函数还有许多参数可以帮助你处理各种各样的异形文件格式。比如说,你可以用skiprows跳过文件的第一行、第三行和第四行:
In [12]: pd.read_csv('D:/python/学习笔记/examples/ex4.csv', skiprows=[0, 2, 3]) Out[12]: 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及NULL:
In [13]:result=pd.read_csv('D:/python/学习笔记/examples/ex5.csv') In [14]: result Out[14]: something a b c d message 0 one 1 2 3.0 4 NaN 1 two 5 6 NaN 8 world 2 three 9 10 11.0 12 foo In [15]: pd.isnull(result) Out[15]: 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可以用一个列表或集合的字符串表示缺失值:
In [16]: result = pd.read_csv('D:/python/学习笔记/examples/ex5', na_values=['NULL']) In [17]: result Out[17]: something a b c d message 0 one 1 2 3.0 4 NaN 1 two 5 6 NaN 8 world 2 three 9 10 11.0 12 foo
字典的各列可以使用不同的NA标记值:
In [18]: sentinels = {'message': ['foo', 'NA'], 'something': ['two']} In [19]: pd.read_csv('D:/python/学习笔记/ex