Pandas数据存取
数据的输入和输出是Pandas的基础操作
Pandas可以存取多种介质类型数据:常见的有:
- 文本类数据
- csv
- JSON
- 二进制磁盘数据
- Excel
- pkl
- HDF5
- 数据库
- SQL(略)
- Web API数据
- HTML
- 其他
- 内存
官方手册中找到:
文本类数据文件读入Pandas时会自动推断每列数据类型(类型推断)并转化。
二进制类数据文件会在格式中存储数据类型
对Pandas不能直接支持或不方便使用的数据格式,
可以使用支持软件将其转为csv或xlsx格式后使用Pandas读写,如SPSS文件
import numpy as np
import pandas as pd
av = [
['小明','male',18,170,60,'北京海淀',61],
['小华','female',28,160,50,'上海静安',74],
['小红','female',22,175,64,'广州天河',59],
['小靑','male',31,182,80,'深圳南山',82],
['小兰','female',25,165,55,'杭州西湖',98],
]
a = pd.DataFrame(
av,
index=[1,2,3,4,5],
columns=['name','sex','age','heigh','weight','address','grade']
)
a
image.png
a.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5 entries, 1 to 5
Data columns (total 7 columns):
name 5 non-null object
sex 5 non-null object
age 5 non-null int64
heigh 5 non-null int64
weight 5 non-null int64
address 5 non-null object
grade 5 non-null int64
dtypes: int64(4), object(3)
memory usage: 320.0+ bytes
df = pd.DataFrame(np.random.randn(1000, 4),columns=['A', 'B', 'C', 'D'])
df.head()
#numpy.random.randn(d0,d1,…,dn)
#•randn函数返回一个或一组样本,具有标准正态分布。
#•dn表格每个维度
#•返回值为指定维度的array
#head()取前五条
image.png
Pandas存取CSV
CSV
Comma-Separated Values,逗号分隔值
以纯文本形式存储表格数据的一种格式
二维表格数据结构
CSV是一种简单、通用的文件格式,常用于在不同程序和环境之间中转表格数据,
这些程序本身是在不兼容的格式上进行操作的(往往是私有的和/或无规范的格式),
基本所有数据类软件和环境都支持读写CSV文件
csv表格,ceshi.csv
name,age,address,grade
张三,18,"aaa,bbb",60
张三,18,"北,京",60
张三,18,北京,60
# 读取csv文件
pd.read_csv('data/ceshi.csv', encoding='GBK')
image.png
写入csv
默认utf-8格式
保存其他格式可以自行设置参数 encoding
注意:Excel打开utf-8的csv文件,中文会乱码,建议保存为gbk
a
image.png
# 保存csv文件,默认utf8格式
a.to_csv('data/foo.csv')
# 保存csv文件,设置保存为GBK格式
a.to_csv('data/foo2.csv', encoding='GBK')
读取CSV
注意文本文件编码格式问题
UTF-8,默认支持
其他编码,需要手动设置参数 encoding
注意:utf-8格式的csv文件,Excel读取时中文会乱
# 读取csv文件
pd.read_csv('data/foo.csv')
image.png
a2 = pd.read_csv('data/foo2.csv', encoding='GBK')
a2
image.png
查看读入数据的列类型是否正常
a2.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 8 columns):
Unnamed: 0 5 non-null int64
name 5 non-null object
sex 5 non-null object
age 5 non-null int64
heigh 5 non-null int64
weight 5 non-null int64
address 5 non-null object
grade 5 non-null int64
dtypes: int64(5), object(3)
memory usage: 400.0+ bytes
进阶:CSV写入和读取的常见参数设置
写入CSV设置
a
image.png
a.to_csv(
'data/foo3.csv',
index=False, # 不保存行索引***************************
# header=False, # 不保存列索引
columns=['name', 'address', 'grade'], # 只保存指定列
)
pd.read_csv('data/foo3.csv')
image.png
读取CSV常见设置
a3 = pd.read_csv(
'data/foo.csv', # 读取文件路径
sep=',', # 指定分隔符,csv默认逗号,如果是table表格数据一般为 \t
# 列索引
# header=0, # 列索引,默认0将第一行设为表头(其他行号也可),
# header=None, # None不将第一行设为表头(列索引),
# header=[0,1,2], # [0,1]列表可将多行同时设为表头(层次化索引)
# names=['x','姓名', '性别', '年龄', '身高', '体重', '地址', '成绩'], # 配合header=0,自定义列索引
# 行索引
# index_col=None, # 行索引,默认值None:不使用数据列,而是使用系统自带索引
# index_col=0, # 把第0列作为行索引
# index_col='name', # (自定义列 作为行索引),
# index_col=[0,1,2], # 默认索引,多列 层次化索引
# index_col=['name','sex','age'], # 自定义索引,多列
# 读取指定的行和列
# usecols=[0,2,4], # 读取指定列,默认索引
# usecols=['name', 'address', 'grade'], # 读取指定列,自定义索引
# nrows=3, # 读取前几行
# skiprows=3, # 从表格开始算起,忽略的行
# skiprows=[2,4], # [2,4]跳过文件第2/4行
# skipfooter=2, # 从表格末尾算起忽略的行,必须配合engine='python'否则会报警告
# engine='python', # 引擎。c更快,python更完善
# 替换空值
# na_values=['male'], # 将csv中某些字符替换为空值
# keep_default_na=False, # 默认True同时使用系统自带空值替换和自定义空值,如 NA,N/A等,False只使用自定义空值
# encoding='utf-8', # 编码,默认utf-8,引擎是python时需要手动设置
)
a3
image.png
a3.loc[4, 'weight']
55
DataFrame层次化索引的查询
a33 = pd.read_csv('data/foo.csv', header=[0,1,2])
a33
image.png
a33['name']['小明']['小华'][0]
'小红'
a34 = pd.read_csv('data/foo.csv', index_col=[0,1,2])
a34
image.png
a34.loc[1].loc['小明'].loc['male']['address']
'北京海淀'
合并时间列及自定义某列为行索引
多用于时间序列,金融数据分析
参数:parse_dates
- 尝试将数据解析为日期
- 可以使用列表指定需要解析的一组列名,如果列表元素为字典包含的列表或元组,会将多个列组合到一起再解析日期解析(如日期和时间分别在两个列的情况)
参数:keep_date_col
- 如果连接多列解析日期,保存参与连接的列,默认False
数据:aaa.csv
data,time,time2,name,age
20100101,000000,00:00:00,"张三",18
20100101,230000,23:00:00,"李,四",28
t = pd.read_csv('data/aaa.csv')
t
image.png
t.info() # pandas猜测时间列类型错误
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 5 columns):
data 2 non-null int64
time 2 non-null int64
time2 2 non-null object
name 2 non-null object
age 2 non-null int64
dtypes: int64(3), object(2)
memory usage: 160.0+ bytes
t2 = pd.read_csv(
'data/aaa.csv',
# parse_dates=['data'], # 指定某列解析为时间格式
# parse_dates=['data', 'time', 'time2'], # 指定多列解析为时间,不是所有格式都能正确解析
parse_dates={'s': ['data', 'time2']},
keep_date_col=True, # 保留合并前的列
index_col='s', # 指定某列作为行索引
)
t2
image.png
t2.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 2 entries, 2010-01-01 00:00:00 to 2010-01-01 23:00:00
Data columns (total 5 columns):
data 2 non-null object
time 2 non-null int64
time2 2 non-null object
name 2 non-null object
age 2 non-null int64
dtypes: int64(2), object(3)
memory usage: 96.0+ bytes
Pandas存取Excel(xlsx)
a
image.png
df.head()
image.png
写入Excel
# df.to_excel('data/foo.xlsx')
# df.to_excel('data/foo.xlsx', 'abc') # 自定义工作表表名,默认Sheet1
df.to_excel('data/foo.xlsx', sheet_name='abc') # 同上
将多个变量写入同一Excel多个工作表中
# 完整写法
# 创建表格
writer = pd.ExcelWriter('data/output.xlsx')
a.to_excel(
writer,
'abc',
)
df.to_excel(
writer,
'Sheet1', # 工作表表名
index=None, # 不要行索引
header=None, # 不要列索引
)
# 写入
writer.save()
读取
pd.read_excel('data/output.xlsx') # 默认读取第一个工作表
读取第一个工作表.png
pd.read_excel('data/output.xlsx', 'Sheet1').head() # 读取指定的工作表
读取指定的工作表.png
e = pd.read_excel('data/output.xlsx', None) # 读取所有工作表
e
e['abc']
e['Sheet1'].head()
image.png
e['abc'].info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5 entries, 1 to 5
Data columns (total 7 columns):
name 5 non-null object
sex 5 non-null object
age 5 non-null int64
heigh 5 non-null int64
weight 5 non-null int64
address 5 non-null object
grade 5 non-null int64
dtypes: int64(4), object(3)
memory usage: 320.0+ bytes
复杂读取参数
x = pd.read_excel(
'data/output.xlsx',
# sheet_name=1, # 工作表名,默认第一个工作表,注意新版pandas是sheet_name
# sheet_name=[0,1], # 选中的多个工作表
sheet_name=None, # 所有的工作表
# header=None, # 不使用行做列索引
# header=1, # 使用某行做列索引
# header=[0,1,2], # 多行做层次化索引
# index_col=1, # 不设行索引,多个[1,2,3]层次化索引
# nrows=3, # 读取前多少行(pandas0.23.0新版才支持)
# skiprows=[2,4], # 跳过的行,从表起始位置算,[2,4]列表参数也可
# skipfooter=2, # 跳过的行,从表结束位置算,默认为0,不能用列表
# na_values='male',# 表示为NAN,na_values可以用一个列表或集合的字符串表示缺失值
# keep_default_na=True, # 默认True在系统自带空值替换符后追加NA值,如 NA,N/A等,False只使用自定义空值
)
x
x['abc']
image.png
JSON
JSON(JavaScript Object Notation)是通过HTTP请求在Web浏览器和其他应用程序之间发送数据的标准格式之一
JSON和CSV比较:
JSON是多维数据文件,CSV是二维数据文件
JSON数据比较冗余,体积较大,CSV精简,体积小
JSON多用于WEB数据交互,CSV多用于计算机软件程序数据交互
如果JSON数据格式维度超过2维,转为DataFrame后,只能将0/1维转为表格,其他维度的JSON会以Python字典格式存入表格单元格
a
image.png
a.to_json('data/foo.json')
pd.read_json('data/foo.json')
image.png
Pandas存取pkl
pkl是Python专有的二进制数据存储格式,可以存储原生的Python数据类型
a
image.png
a.to_pickle('data/foo.pkl')
y = pd.read_pickle('data/foo.pkl')
y
image.png
y.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5 entries, 1 to 5
Data columns (total 7 columns):
name 5 non-null object
sex 5 non-null object
age 5 non-null int64
heigh 5 non-null int64
weight 5 non-null int64
address 5 non-null object
grade 5 non-null int64
dtypes: int64(4), object(3)
memory usage: 320.0+ bytes
使用HDF5格式
科学领域大数据存储的通行标准,如天文、物理、地球科学等
frame = pd.DataFrame({'a': np.random.randn(100)})
frame.loc[:10]
image.png
简单存取
# 存储
frame.to_hdf('data/mydata.h5', 'obj1')
# 读取
# x = pd.read_hdf('data/mydata.h5') # 文件内只存储了一个变量,如果多个变量读取出错
x = pd.read_hdf('data/mydata.h5', 'obj1') # 指定变量名输出
x.loc[:10]
image.png
# 设置存储模式,默认fixed
frame.to_hdf('data/mydata2.h5', 'obj1', format='table')
# 高级查询模式,只能在table模式下实现
x = pd.read_hdf('data/mydata2.h5','obj1', where=['index < 5 and index > 1'])
x
image.png
复杂应用
# 创建或读取HDF5文件(没有就创建,有就读取)
store = pd.HDFStore('data/mydata3.h5')
store
<class 'pandas.io.pytables.HDFStore'>
File path: data/mydata3.h5
# 插入数据到h5
store['obj1'] = frame
store
<class 'pandas.io.pytables.HDFStore'>
File path: data/mydata3.h5
# 继续插入
store['obj1_col'] = frame['a']
store
<class 'pandas.io.pytables.HDFStore'>
File path: data/mydata3.h5
# 读取
store['obj1']
store['obj1_col'][:10]
0 -1.263885
1 2.319688
2 -1.447424
3 -0.341064
4 -0.514138
5 0.947356
6 -0.429651
7 -2.624660
8 -1.076124
9 0.089677
Name: a, dtype: float64
高级用法
# put是直接赋值的显式版本,可以自定义格式化格式
store.put('obj2', frame, format='table')
store
<class 'pandas.io.pytables.HDFStore'>
File path: data/mydata3.h5
# select是高级版读取,可以增加查询条件
store.select('obj2', where=['index >=10 and index <= 20'])
image.png
XML和HTML:Web信息收集
网页中有多个表格的,返回列表,可按列表索引逐个输出
- 有些网站由于网络原因、反爬虫、服务器原因导致无法抓取网页内容,400、500错误,这时可以将网页另存到本地后读取
- 有些网站的表格HTML结构复杂混乱,导致解析表格结构出错,只能手动处理
# table = pd.read_html('http://www.stats.gov.cn/tjsj/zxfb/201806/t20180630_1607071.html') # 某些网络下无法抓取
table = pd.read_html('data/2018年6月中国采购经理指数运行情况.html') # 某些网络下无法抓取
table
[ 0 1 2 3 4 5 6
0 单位:% NaN NaN NaN NaN NaN NaN
1 NaN PMI NaN NaN NaN NaN NaN
2 生产 新订单 原材料 库存 从业人员 供应商配送时间 NaN NaN
3 2017年6月 51.7 54.4 53.1 48.6 49.0 49.9
4 2017年7月 51.4 53.5 52.8 48.5 49.2 50.1
5 2017年8月 51.7 54.1 53.1 48.3 49.1 49.3
6 2017年9月 52.4 54.7 54.8 48.9 49.0 49.3
7 2017年10月 51.6 53.4 52.9 48.6 49.0 48.7
8 2017年11月 51.8 54.3 53.6 48.4 48.8 49.5
9 2017年12月 51.6 54.0 53.4 48.0 48.5 49.3
10 2018年1月 51.3 53.5 52.6 48.8 48.3 49.2
11 2018年2月 50.3 50.7 51.0 49.3 48.1 48.4
12 2018年3月 51.5 53.1 53.3 49.6 49.1 50.1
13 2018年4月 51.4 53.1 52.9 49.5 49.0 50.2
14 2018年5月 51.9 54.1 53.8 49.6 49.1 50.1
15 2018年6月 51.5 53.6 53.2 48.8 49.0 50.2,
0 1 2 3 4 5 6 7 8
0 单位:% NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN 新出口 订单 进口 采购量 主要原材料购进价格 出厂 价格 产成品 库存 在手 订单 生产经营活动预期
2 2017年6月 52.0 51.2 52.5 50.4 49.1 46.3 47.2 58.7
3 2017年7月 50.9 51.1 52.7 57.9 52.7 46.1 46.3 59.1
4 2017年8月 50.4 51.4 52.9 65.3 57.4 45.5 46.1 59.5
5 2017年9月 51.3 51.1 53.8 68.4 59.4 44.2 47.4 59.4
6 2017年10月 50.1 50.3 53.2 63.4 55.2 46.1 45.6 57.0
7 2017年11月 50.8 51.0 53.5 59.8 53.8 46.1 46.6 57.9
8 2017年12月 51.9 51.2 53.6 62.2 54.4 45.8 46.3 58.7
9 2018年1月 49.5 50.4 52.9 59.7 51.8 47.0 45.3 56.8
10 2018年2月 49.0 49.8 50.8 53.4 49.2 46.7 44.9 58.2
11 2018年3月 51.3 51.3 53.0 53.4 48.9 47.3 46.0 58.7
12 2018年4月 50.7 50.2 52.6 53.0 50.2 47.2 46.2 58.4
13 2018年5月 51.2 50.9 53.0 56.7 53.2 46.1 45.9 58.7
14 2018年6月 49.8 50.0 52.8 57.7 53.3 46.3 45.5 57.9,
0 1 2 3 4 5 6
0 单位:% NaN NaN NaN NaN NaN NaN
1 NaN 商务活动 新订单 投入品 价格 销售价格 从业人员 业务活动 预期
2 2017年6月 54.9 51.4 51.2 49.3 49.6 61.1
3 2017年7月 54.5 51.1 53.1 50.9 49.5 61.1
4 2017年8月 53.4 50.9 54.4 51.5 49.5 61.0
5 2017年9月 55.4 52.3 56.1 51.7 49.7 61.7
6 2017年10月 54.3 51.1 54.3 51.6 49.4 60.6
7 2017年11月 54.8 51.8 56.2 52.8 49.2 61.6
8 2017年12月 55.0 52.0 54.8 52.6 49.3 60.9
9 2018年1月 55.3 51.9 53.9 52.6 49.4 61.7
10 2018年2月 54.4 50.5 53.2 49.9 49.6 61.2
11 2018年3月 54.6 50.1 49.9 49.3 49.2 61.1
12 2018年4月 54.8 51.1 52.7 50.6 49.0 61.5
13 2018年5月 54.9 51.0 54.2 50.6 49.2 61.0
14 2018年6月 55.0 50.6 53.5 51.1 48.9 60.8,
0 1 2 3 4
0 单位:% NaN NaN NaN NaN
1 NaN 新出口订单 在手订单 存货 供应商配送时间
2 2017年6月 49.8 44.6 45.9 51.8
3 2017年7月 52.1 43.9 45.9 51.7
4 2017年8月 49.0 44.0 45.5 51.1
5 2017年9月 49.7 44.2 47.0 51.6
6 2017年10月 50.7 43.9 46.4 51.1
7 2017年11月 50.9 44.1 46.5 51.6
8 2017年12月 51.5 43.8 46.3 51.3
9 2018年1月 50.1 44.4 46.5 51.3
10 2018年2月 45.9 43.8 47.6 50.7
11 2018年3月 50.4 44.3 46.2 51.6
12 2018年4月 50.0 44.4 46.7 51.5
13 2018年5月 49.1 44.1 46.0 51.7
14 2018年6月 48.2 44.0 46.4 51.6,
0 \
0 document.write(unescape("%3Cspan id='_ideConac...
1 2
0 版权所有:中华人民共和国国家统计局 地址:北京市西城区月坛南街57号(100826) 京... NaN ]
table[0]
table[1]
table[2]
table[3]
table[4]
image.png
table[0]
image.png
Pandas从剪贴板(内存)读取数据
多用于将网页表格内容直接转换为DataFrame
# https://cn.investing.com/currencies/usd-cny-historical-data
pd.read_clipboard(engine='python')
image.png
pd.read_clipboard(header=None, engine='python') # 不将第一行设为表头
image.png
# http://www.stats.gov.cn/tjsj/zxfb/201806/t20180630_1607071.html
# 解析表格出错,需要手动处理
pd.read_clipboard(header=None, engine='python')
image.png