简介
读写操作方便数据的迁移储存,pandas提供了非常丰富的接口,能够实现对二进制数据、文本文件、剪贴板内容、Excel、JSON格式、HTML格式和HDF5格式等数据的读写,操作非常方便。本文将介绍几个主要操作:
- CSV格式文件读写;
- Excel格式文件读写;
- JSON格式文件读写;
- HDF5格式文件读写。
CSV格式
该格式的文本文件内容都是以逗号 , 分隔, 比如有个叫 finthon.csv 的文件,包含以下内容:
1 2 3 4 5 |
a,b,c,d,e 3,4,0,4,5 8,7,2,4,1 8,9,7,5,4 2,9,2,7,7 |
可以使用 read_csv 方法读取该数据:
1 2 3 4 5 6 7 8 9 10 |
>>>import numpy as np >>>import pandas as pd >>>data = pd.read_csv('finthon.csv') >>>data a b c d e 0 3 4 0 4 5 1 8 7 2 4 1 2 8 9 7 5 4 3 2 9 2 7 7 |
这样我们就得到了一个DataFrame,自动添加了索引。除了逗号分隔的数据,通过 sep 参数是可以指定分隔类型的。比如 finthon1.csv 有这样的数据:
1 2 3 4 5 |
a|b|c|d|e 1|7|0|3|2 1|0|9|7|8 8|4|6|4|2 6|9|3|9|1 |
数据中是通过 | 进行分隔,我们可以这样加载数据:
1 2 3 4 5 6 7 |
>>>data1 = pd.read_csv('finthon1.csv', sep='|') >>>data1 a b c d e 0 1 7 0 3 2 1 1 0 9 7 8 2 8 4 6 4 2 3 6 9 3 9 1 |
如果遇到数据集没有标题行的情况, finthon2.csv 文件内容:
1 2 3 4 |
3,4,0,4,5 8,7,2,4,1 8,9,7,5,4 2,9,2,7,7 |
我们可以为其分配默认的列名:
1 2 3 4 5 6 7 |
>>>data2 = pd.read_csv('finthon2.csv', header=None) >>>data2 0 1 2 3 4 0 3 4 0 4 5 1 8 7 2 4 1 2 8 9 7 5 4 3 2 9 2 7 7 |
或者我们可以通过 names 参数为其分配自定义的列名:
1 2 3 4 5 6 7 |
>>>data3 = pd.read_csv('finthon2.csv', names=list('abcde')) >>>data3 a b c d e 0 3 4 0 4 5 1 8 7 2 4 1 2 8 9 7 5 4 3 2 9 2 7 7 |
如果不想用默认的索引,而是要将某列作为索引,可以通过 index_col 参数实现:
1 2 3 4 5 6 7 8 |
>>>data4 = pd.read_csv('finthon2.csv', name=list('abcde'), index_col='e') >>>data4 a b c d e 5 3 4 0 4 1 8 7 2 4 4 8 9 7 5 7 2 9 2 7 |
还可以传入多个列名,创建层次化索引:
1 2 3 4 5 6 7 8 |
>>>data5 = pd.read_csv('finthon2.csv', name=list('abcde'), index_col=['a', 'e']) >>>data5 b c d a e 3 5 4 0 4 8 1 7 2 4 4 9 7 5 2 7 9 2 7 |
还有一种情况,比如文件中有一些行的数据是我们不需要的, finthon3.csv 内容如下:
1 2 3 4 5 6 7 8 |
# this is a csv file a,b,c,d,e # welcome to finthon.com # i love you 3,4,0,4,5 8,7,2,4,1 8,9,7,5,4 2,9,2,7,7 |
我们不想要文件中的注释行,此时就可以通过 skiprows 参数跳过不需要的行:
1 2 3 4 5 6 7 |
>>>data6 = pd.read_csv('finthon3.csv', skiprows=[0, 2, 3]) >>>data6 a b c d e 0 3 4 0 4 5 1 8 7 2 4 1 2 8 9 7 5 4 3 2 9 2 7 7 |
介绍完csv格式读取操作,接下来介绍写入操作,通过 to_csv 方法实现。我们有如下DataFrame:
1 2 3 4 5 6 |
>>>data7 = pd.DataFrame(np.random.randint(0, 10, (3, 4)), columns=list('abcd'), index=['one', 'two', 'three']) >>>data7 a b c d one 7 6 0 4 two 4 7 5 8 three 8 2 2 1 |
写入 finthon4.csv 文件:
1 |
>>>data7.to_csv('finthon4.csv') |
查看该文件,得到如下内容:
1 2 3 4 |
,a,b,c,d one,7,6,0,4 two,4,7,5,8 three,8,2,2,1 |
默认是以逗号 , 分隔,我们也可以指定分隔方式:
1 |
>>>data7.to_csv('finthon5.csv', sep='|') |
得到内容如下:
1 2 3 4 |
|a|b|c|d one|7|6|0|4 two|4|7|5|8 three|8|2|2|1 |
有时候我们并不需要保存索引或列名,可以这样实现:
1 |
>>>data7.to_csv('finthon6.csv', header=False, index=False) |
header=False 表示不需要保存列名, index=False 表示不需要保存索引。得到的内容如下:
1 2 3 |
7,6,0,4 4,7,5,8 8,2,2,1 |
Excel格式
读取一个excel文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
>>>df = pd.read_excel('finthon.xlsx', 'Sheet1', index_col=None, na_values=['NA']) >>>df A B C D 2000-01-01 0.266457 -0.399641 -0.219582 1.186860 2000-01-02 -1.170732 -0.345873 1.653061 -0.282953 2000-01-03 -1.734933 0.530468 2.060811 -0.515536 2000-01-04 -1.555121 1.452620 0.239859 -1.156896 2000-01-05 0.578117 0.511371 0.103552 -2.428202 2000-01-06 0.478344 0.449933 -0.741620 -1.962409 2000-01-07 1.235339 -0.091757 -1.543861 -1.084753 ... ... ... ... ... 2002-09-20 -10.628548 -9.153563 -7.883146 28.313940 2002-09-21 -10.390377 -8.727491 -6.399645 30.914107 2002-09-22 -8.985362 -8.485624 -4.669462 31.367740 2002-09-23 -9.558560 -8.781216 -4.499815 30.518439 2002-09-24 -9.902058 -9.340490 -4.386639 30.105593 2002-09-25 -10.216020 -9.480682 -3.933802 29.758560 2002-09-26 -11.856774 -10.671012 -3.216025 29.369368 [1000 rows x 4 columns] |
读取了 finthon.xlsx 文件表单名为 Sheet1 的内容, na_values 指定缺失值标记为 NA 。
写入excel文件:
1 |
>>>df.to_excel('foo.xlsx', sheet_name='Sheet1') |
将 df 保存为 foo.xlsx 文件,通过 sheet_name 指定表单名。
JSON格式
JSON格式是Web应用程序使用的标准格式之一,它的基本类型有对象(字典)、数组(列表)、字符串、数值、布尔值和null。对象中的所有键必须是字符串。
比如现有JSON格式文件 finthon.json 内容如下:
1 2 |
{"a":{"one":7,"two":4,"three":8},"b":{"one":6,"two":7,"three":2}, "c":{"one":0,"two":5,"three":2},"d":{"one":4,"two":8,"three":1}} |
我们来读取这个文件:
1 2 3 4 5 6 |
>>>df = pd.read_json('finthon.json') >>>df a b c d one 7 6 0 4 three 8 2 2 1 two 4 7 5 8 |
在json格式中比较重要的参数是 orient ,它可以控制读写json文件的方式,有如下几个参数:
- split:字典形式, {index: [index], columns: [columns], data: [values]} ;
- records:列表形式,不包含index, [{column1: value1, column2: value2}, {column1: value3, column2: value4}] ;
- index:字典形式, {index1: {column1: value1, column2: value2}, index2: {column1: value3, column2: value4}} ;
- columns:字典形式, {column1: {index1: value1, index2: value2}, column2: {index1: value3, index2: value4}}
- values:数据data的数组;
- table:字典形式,版本0.23.0新增。
在上面读取 finthon.json 文件,默认使用的就是 orient=columns 方式。
通过保存如下DataFrame内容为json格式文件来说明以上参数的区别:
1 2 3 4 5 |
>>>df1 a b c d one 7 6 0 4 two 4 7 5 8 three 8 2 2 1 |
使用不同的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# 默认为columns >>>df1.to_json('finthon1.json') {"a":{"one":7,"two":4,"three":8},"b":{"one":6,"two":7,"three":2}, "c":{"one":0,"two":5,"three":2},"d":{"one":4,"two":8,"three":1}} # columns方式 >>>df1.to_json('finthon2.json', orient='columns') {"a":{"one":7,"two":4,"three":8},"b":{"one":6,"two":7,"three":2}, "c":{"one":0,"two":5,"three":2},"d":{"one":4,"two":8,"three":1}} # split方式 >>>df1.to_json('finthon3.json', orient='split') {"columns":["a","b","c","d"],"index":["one","two","three"], "data":[[7,6,0,4],[4,7,5,8],[8,2,2,1]]} # records方式 >>>df1.to_json('finthon4.json', orient='records') [{"a":7,"b":6,"c":0,"d":4},{"a":4,"b":7,"c":5,"d":8}, {"a":8,"b":2,"c":2,"d":1}] # index方式 >>>df1.to_json('finthon5.json', orient='index') {"one":{"a":7,"b":6,"c":0,"d":4},"two":{"a":4,"b":7,"c":5,"d":8}, "three":{"a":8,"b":2,"c":2,"d":1}} # values方式 >>>df1.to_json('finthon6.json', orient='values') [[7,6,0,4],[4,7,5,8],[8,2,2,1]] |
选择不同的存储,在读取的时候最好指明读取的方式,不然可能引起错误。比如:
1 2 3 4 5 |
>>>pd.read_json('finthon3.json', orient='split') a b c d one 7 6 0 4 two 4 7 5 8 three 8 2 2 1 |
HDF5格式
这种格式用于磁盘上以二进制格式存储科学数据,对于那些非常大并且无法直接放入内存的数据集,选用HDF5格式更好。
1 2 3 |
>>> df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, ... index=['a', 'b', 'c']) >>> df.to_hdf('finthon.h5', key='df', mode='w') |
我们可以在同一个文件中添加另一个对象:
1 2 |
>>> s = pd.Series([1, 2, 3, 4]) >>> s.to_hdf('finthon.h5', key='s') |
从HDF文件中读取:
1 2 3 4 5 6 7 8 9 10 11 |
>>> pd.read_hdf('finthon.h5', 'df') A B a 1 4 b 2 5 c 3 6 >>> pd.read_hdf('finthon.h5', 's') 0 1 1 2 2 3 3 4 dtype: int64 |
总结
本文主要介绍了CSV格式、Excel格式、JSON格式、HDF5格式文件读写。可以看到读写的接口都非常类似,通过 read_ 读取,通过 to_ 写入;除此之外,还要注意不同的格式当中主要参数的设置。