title: ‘初识Pandas系列三:数据读写’
tags:
- Pandas
categories: - Python
cover: ‘http://qiniu.zhouwenzhen.top/qiniuImg/pandas.jpg‘
hidden: false
hide: false
abbrlink: 35c1639e
date: 2020-07-16 00:00:00
Pandas的数据读写
Pandas的I/O API是一组read()和write()函数,下面是一个方法列表,包含了这里面的所有readers
函数和writer
函数。
CSV的读写
read_csv
基本参数:
filepath_or_buffer
:可以是文件路径、URL或者是对象(该对象需要具有read()方法)sep
(str) : 分隔符,默认为英文逗号(,),可以忽略这个参数,如果是其它分割方式,则要填写delimiter
(str):sep的替代参数,默认为Nonedelim_whitespace
(boolean): 指定是否将空格 (e.g. ‘ ‘ or ‘\t’ )当作delimiter。 等价于设置 sep=’\s+’。如果这个选项被设置为 True,就不需要给 delimiter 传参。encoding
(str):pandas默认编码是utf-8,如果同样读取默认uft-8的txt或者json格式,则可以忽略这个参数,如果是csv,且数据中有中文时,则要指定encoding=‘gbk’header
(int or list of ints): 指定第一行是否是列名,默认为infer。通常有三种用法,忽略或header=0(表示数据第一行为列名,header=None(表明数据没有列名),常与names搭配使用names
(array-like): 指定列名,通常用一个字符串列表表示,默认为None。当header=0时,用names可以替换掉数据中的第一行作为列名,如果header=None,用names可以增加一行作为列名,如果没有header参数时,用names会增加一行作为列名,原数据的第一行仍然保留usecols
(list-like or callable):一个字符串列表,可以指定读取的列名,默认为Noneindex_col
(int, str, sequence of int / str, or False): 一个字符串列表,指定哪几列作为索引,默认为None。当index_col=False,pandas不再使用首列作为索引。skiprows
( list-like or integer): 跳过多少行再读取数据,通常是数据不太干净,需要去除掉表头才会用到nrows
(int): 仅读取多少行,后面的处理也都仅限于读取的这些行
更多参数可以参考:https://www.pypandas.cn/docs/user_guide/io.html#csv-%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6
举例
data = pd.read_csv('example_wp_log_peyton_manning.csv')
print(data)
"""
ds y
0 2007-12-10 9.590761
1 2007-12-11 8.519590
2 2007-12-12 8.183677
3 2007-12-13 8.072467
4 2007-12-14 7.893572
... ...
2900 2016-01-16 7.817223
2901 2016-01-17 9.273878
2902 2016-01-18 10.333775
2903 2016-01-19 9.125871
2904 2016-01-20 8.891374
[2905 rows x 2 columns]
"""
header默认为infer,如果设置header=None,会在原来的数据上添加一行,从0开始
data = pd.read_csv('example_wp_log_peyton_manning.csv', header=None, nrows=10)
print(data)
"""
0 1
0 ds y
1 2007-12-10 9.59076113897809
2 2007-12-11 8.51959031601596
3 2007-12-12 8.18367658262066
4 2007-12-13 8.07246736935477
5 2007-12-14 7.8935720735049
6 2007-12-15 7.78364059622125
7 2007-12-16 8.41405243249672
8 2007-12-17 8.82922635473185
9 2007-12-18 8.38251828808963
"""
header=None,配合names对新增的一行进行重命名:
data = pd.read_csv('example_wp_log_peyton_manning.csv', header=None, nrows=10, names=['time', 'value'])
print(data)
"""
time value
0 ds y
1 2007-12-10 9.59076113897809
2 2007-12-11 8.51959031601596
3 2007-12-12 8.18367658262066
4 2007-12-13 8.07246736935477
5 2007-12-14 7.8935720735049
6 2007-12-15 7.78364059622125
7 2007-12-16 8.41405243249672
8 2007-12-17 8.82922635473185
9 2007-12-18 8.38251828808963
"""
如果header=0,默认为数据第一行作为列名,使用names对列名进行修改:
data = pd.read_csv('example_wp_log_peyton_manning.csv', header=0, nrows=10, names=['time', 'value'])
print(data)
"""
time value
0 2007-12-10 9.590761
1 2007-12-11 8.519590
2 2007-12-12 8.183677
3 2007-12-13 8.072467
4 2007-12-14 7.893572
5 2007-12-15 7.783641
6 2007-12-16 8.414052
7 2007-12-17 8.829226
8 2007-12-18 8.382518
9 2007-12-19 8.069655
"""
设置index_col=0为索引:
data = pd.read_csv('example_wp_log_peyton_manning.csv', index_col=0, nrows=10)
print(data)
"""
y
ds
2007-12-10 9.590761
2007-12-11 8.519590
2007-12-12 8.183677
2007-12-13 8.072467
2007-12-14 7.893572
2007-12-15 7.783641
2007-12-16 8.414052
2007-12-17 8.829226
2007-12-18 8.382518
2007-12-19 8.069655
"""
使用usecols指定读取的列,需要输入一个字符串列表
data = pd.read_csv('example_wp_log_peyton_manning.csv', usecols=['ds'], nrows=10)
print(data)
"""
ds
0 2007-12-10
1 2007-12-11
2 2007-12-12
3 2007-12-13
4 2007-12-14
5 2007-12-15
6 2007-12-16
7 2007-12-17
8 2007-12-18
9 2007-12-19
"""
to_csv
基本参数
path_or_buf
: 输出的文件名sep
(str) : 分隔符,默认为英文逗号(,)na_rep
(str): 缺少值的字符串表示形式,默认为空columns
(list-like or callable): 输出的列header
(boolean): 是否包含列名index
(boolean): 是否包含索引encoding
: 数据的编码格式
举例
data = pd.read_csv('example_wp_log_peyton_manning.csv', nrows=10)
data.to_csv('test.csv')
"""
,ds,y
0,2007-12-10,9.59076113897809
1,2007-12-11,8.51959031601596
2,2007-12-12,8.18367658262066
3,2007-12-13,8.072467369354769
4,2007-12-14,7.893572073504901
5,2007-12-15,7.78364059622125
6,2007-12-16,8.41405243249672
7,2007-12-17,8.82922635473185
8,2007-12-18,8.38251828808963
9,2007-12-19,8.06965530688617
"""
设置header=False,index=False,并指定只输出ds列
data = pd.read_csv('example_wp_log_peyton_manning.csv', nrows=10)
data.to_csv('test.csv', header=False, index=False,columns=['ds'])
"""
2007-12-10
2007-12-11
2007-12-12
2007-12-13
2007-12-14
2007-12-15
2007-12-16
2007-12-17
2007-12-18
2007-12-19
"""
TXT读写
read_table
基本参数和read_csv类似,其中要注意的是txt格式可能会有多种分割符号,sep用正则表达式'\s+'
,可以匹配多种分割符号
to_table
基本参数和to_csv类似,只是输入文件格式由csv改为txt即可
JSON读写
read_json
把JSON字符串读取到pandas对象里会采用很多参数。如果typ
没有提供或者为None
,解析器将尝试解析DataFrame
。 要强制地进行Series
解析,请传递参数如typ = series
。
filepath_or_buffer
: 一个有效的JSON字符串或文件句柄/StringIO(在内存中读写字符串)。字符串可以是一个URL。有效的URL格式包括http, ftp, S3和文件。对于文件型的URL, 最好有个主机地址。例如一个本地文件可以是 file://localhost/path/to/table.json 这样的格式。typ
: 要恢复的对象类型(series或者frame),默认“frame”。orient
:
Series:- 默认是
index
。 - 允许值为{
split
,records
,index
}。
- 默认是
DataFrame:
- 默认是
columns
。 - 允许值是{
split
,records
,index
,columns
,values
,table
}。
JSON字符串的格式:
split | dict like {index -> [index], columns -> [columns], data -> [values]} |
---|---|
records | list like [{column -> value}, … , {column -> value}] |
index | dict like {index -> {column -> value}} |
columns | dict like {column -> {index -> value}} |
values | just the values array |
table | adhering to the JSON Table Schema |
dtype
: 如果为True,推断dtypes,如果列为dtype的字典,则使用那些;如果为False
,则根本不推断dtypes,默认为True,仅适用于数据。 如果需要覆盖特定的dtypes,请将字典传递给dtype
convert_axes
: 布尔值,尝试将轴转换为正确的dtypes,默认为True
。convert_dates
:一列列表要解析为日期; 如果为True
,则尝试解析类似日期的列,默认为True
。keep_default_dates
:布尔值,默认为True
。 如果解析日期,则解析默认的类似日期的列。numpy
:直接解码为NumPy数组。 默认为False
; 虽然标签可能是非数字的,但仅支持数字数据。 另请注意,如果numpy = True
,则每个术语的JSON顺序 必须 相同。precise_float
:布尔值,默认为False
。 当解码字符串为双值时,设置为能使用更高精度(strtod)函数。 默认(False
)快速使用但不精确的内置功能。date_unit
:字符串,用于检测转换日期的时间戳单位。 默认无。 默认情况下,将检测时间戳精度,如果不需要,则传递’s’,’ms’,’us’或’ns’中的一个,以强制时间戳精度分别为秒,毫秒,微秒或纳秒。lines
:读取文件每行作为一个JSON对象。encoding
:用于解码py3字节的编码。chunksize
:当与lines = True
结合使用时,返回一个Json读取器(JSONReader),每次迭代读取chunksize
行。
举例
json='{"a":-0.1693901033,"b":-1.0981572547,"c":0.89998617,"d":0.4362784716,"e":0.3044175417}'
print(pd.read_json(json,typ='series'))
"""
a -0.169390
b -1.098157
c 0.899986
d 0.436278
e 0.304418
dtype: float64
"""
json='{"a":{"A":1,"B":4},"b":{"A":2,"B":5},"c":{"A":3,"B":6}}'
print(pd.read_json(json))
"""
a b c
A 1 2 3
B 4 5 6
"""
# 不要转换任何数据
print(pd.read_json(json, dtype=object).dtypes)
"""
a object
b object
c object
dtype: object
"""
# 指定转换的dtypes:
print(pd.read_json(json, dtype={'a': 'float32'}).dtypes)
"""
a float32
b int64
c int64
dtype: object
"""
to_json
将一个Series或DataFrame转换成一个有效JSON字符串,Series和DataFrane可以参考Pandas的数据结构
基本参数
path_or_buf
: 写入输出的路径名或缓存可以是None
, 在这种情况下会返回一个JSON字符串。orient
:Series
:- 默认是
index
; - 允许的值可以是{
split
,records
,index
}。
- 默认是
DataFrame
:
- 默认是
columns
; - 允许的值可以是{
split
,records
,index
,columns
,values
,table
}。
JSON字符串的格式:
split | dict like {index -> [index], columns -> [columns], data -> [values]} |
---|---|
records | list like [{column -> value}, … , {column -> value}] |
index | dict like {index -> {column -> value}} |
columns | dict like {column -> {index -> value}} |
values | just the values array |
date_format
: 字符串,日期类型的转换,’eposh’是时间戳,’iso’是 ISO8601。double_precision
: 当要编码的是浮点数值时使用的小数位数,默认是 10。force_ascii
: 强制编码字符串为 ASCII , 默认是True。date_unit
: 时间单位被编码来管理时间戳 和 ISO8601精度。’s’, ‘ms’, ‘us’ 或’ns’中的一个分别为 秒,毫秒,微秒,纳秒。默认是 ‘ms’。default_handler
: 如果一个对象没有转换成一个恰当的JSON格式,处理程序就会被调用。采用单个参数,即要转换的对象,并返回一个序列化的对象。lines
: 如果面向records
,就将每行写入记录为json。
举例
d = pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]), orient='index', columns=['a', 'b', 'c'])
print(d)
"""
a b c
A 1 2 3
B 4 5 6
"""
json = d.to_json()
print(json)
"""
{"a":{"A":1,"B":4},"b":{"A":2,"B":5},"c":{"A":3,"B":6}}
"""
s = pd.Series(data=np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'], name='test')
print(s)
"""
a -0.169390
b -1.098157
c 0.899986
d 0.436278
e 0.304418
Name: test, dtype: float64
"""
json = s.to_json()
print(json)
"""
{"a":-0.1693901033,"b":-1.0981572547,"c":0.89998617,"d":0.4362784716,"e":0.3044175417}
"""
d = pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]), orient='index', columns=['a', 'b', 'c'])
print(d)
"""
a b c
A 1 2 3
B 4 5 6
"""
json = d.to_json()
print(json)
"""
{"a":{"A":1,"B":4},"b":{"A":2,"B":5},"c":{"A":3,"B":6}}
"""
# 面向列的序列化数据,列标签为主键
print(d.to_json(orient="columns"))
"""
{"a":{"A":1,"B":4},"b":{"A":2,"B":5},"c":{"A":3,"B":6}}
"""
# 面向索引(行)的序列化数据,索引为主键
print(d.to_json(orient="index"))
"""
{"A":{"a":1,"b":2,"c":3},"B":{"a":4,"b":5,"c":6}}
"""
# 面向记录的序列化数据,其结果为一列JSON数组,索引标签不包括在内
print(d.to_json(orient="records"))
"""
[{"a":1,"b":2,"c":3},{"a":4,"b":5,"c":6}]
"""
#面向值是一个概要的选项,它只序列化为嵌套的JSON数组值,列和索引标签不包括在内
print(d.to_json(orient="values"))
"""
[[1,2,3],[4,5,6]]
"""
#面向切分序列化成一个JSON对象,它包括单项的值、索引和列
print(d.to_json(orient="split"))
"""
{"columns":["a","b","c"],"index":["A","B"],"data":[[1,2,3],[4,5,6]]}
"""
日期处理
使用ISO日期格式写入:
dfd = pd.DataFrame(np.random.randn(5, 2), columns=list('AB'))
print(dfd)
"""
A B
0 -0.257501 -0.797096
1 -1.787324 -0.797445
2 -0.968066 0.466573
3 0.305872 0.795448
4 -0.568483 -1.584783
"""
dfd['date'] = pd.Timestamp('20200101')
print(dfd)
"""
A B date
0 -0.257501 -0.797096 2020-01-01
1 -1.787324 -0.797445 2020-01-01
2 -0.968066 0.466573 2020-01-01
3 0.305872 0.795448 2020-01-01
"""
# axis:0按照行名排序;1按照列名排序,ascending:默认True升序排列;False降序排列
dfd = dfd.sort_index(axis=1, ascending=False)
print(dfd)
"""
date B A
0 2020-01-01 -0.797096 -0.257501
1 2020-01-01 -0.797445 -1.787324
2 2020-01-01 0.466573 -0.968066
3 2020-01-01 0.795448 0.305872
4 2020-01-01 -1.584783 -0.568483
"""
json = dfd.to_json(date_format='iso')
print(json)
"""
{"date":{"0":"2020-01-01T00:00:00.000Z","1":"2020-01-01T00:00:00.000Z","2":"2020-01-01T00:00:00.000Z","3":"2020-01-01T00:00:00.000Z","4":"2020-01-01T00:00:00.000Z"},"B":{"0":-0.7970955662,"1":-0.7974451025,"2":0.4665727108,"3":0.7954484653,"4":-1.5847833059},"A":{"0":-0.2575013321,"1":-1.7873236202,"2":-0.9680664354,"3":0.3058715067,"4":-0.5684833982}}
"""
# 也可以设置date_unit为微秒单位
json = dfd.to_json(date_format='iso',date_unit='us')
print(json)
"""
{"date":{"0":"2020-01-01T00:00:00.000000Z","1":"2020-01-01T00:00:00.000000Z","2":"2020-01-01T00:00:00.000000Z","3":"2020-01-01T00:00:00.000000Z","4":"2020-01-01T00:00:00.000000Z"},"B":{"0":-1.4950061863,"1":0.2840948052,"2":0.7902045128,"3":0.968017663,"4":1.2580812032},"A":{"0":-0.0400243341,"1":-0.2648944433,"2":-1.233445634,"3":-1.1086753596,"4":-2.5585893491}}
"""
#设置date_unit为秒单位
json = dfd.to_json(date_format='iso',date_unit='s')
print(json)
"""
{"date":{"0":"2020-01-01T00:00:00Z","1":"2020-01-01T00:00:00Z","2":"2020-01-01T00:00:00Z","3":"2020-01-01T00:00:00Z","4":"2020-01-01T00:00:00Z"},"B":{"0":-1.4950061863,"1":0.2840948052,"2":0.7902045128,"3":0.968017663,"4":1.2580812032},"A":{"0":-0.0400243341,"1":-0.2648944433,"2":-1.233445634,"3":-1.1086753596,"4":-2.5585893491}}
"""
更多参数的解释和举例https://www.pypandas.cn/docs/user_guide/io.html#json