Pandas数据存取

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容