Pandas 文件读取和导出

更新时间:2020-12-28 00:16:20标签:pandas io

说明

Pandas 中文教程修订中,欢迎加微信 sinbam 提供建议、纠错、催更。查看更新日志

我们拿到的数据一般是 CSV、Excel 等格式,将文件加载到 Pandas 的 DataFrame 对象,我们就可以用它的方法进行处理了。在处理结束后,我们也需要将文件导出 Excel 等格式,方便查看。

本页介绍最常用的文件格式和最基本的用法,如有必要会专题介绍更加详细的功能。

功能列表

下边是我们经常使用的方法:

格式 文件格式 读取函数 写入(输出)函数
binary Excel read_excel to_excel
text CSV read_csv read_table to_csv
text JSON read_json to_json
text 网页表格 HTML read_html to_html
text 剪贴板 read_clipboard to_clipboard
SQL SQL read_sql to_sql
text Markdown   to_markdown

读取更多类型文件可查看官网文档。

其中:

  • 读取函数一般会赋值给一个变量 dfdf = pd.read_<xxx>()
  • 输出函数是将变量自身进行操作并输出 df.to_<xxx>()

CSV

从 CSV 文件中读取数据并加载到 DataFrame:

文件

# 文件目录
pd.read_csv('data.csv') # 如果文件与代码文件在同目录下
pd.read_csv('data/my/data.csv') # 指定目录
pd.read_csv('data/my/my.data') # CSV 文件扩展名不一定是 csv
# 使用网址 url
pd.read_csv('https://www.gairuo.com/file/data/dataset/GDP-China.csv')# 也可以从 StringIO 中读取
from io import StringIO
data = ('col1,col2,col3\n''a,b,1\n''a,b,2\n''c,d,3')
pd.read_csv(StringIO(data))

注:csv 文件扩展名不一定是 .csv

指定分隔符号

# 数据分隔转化是逗号, 如果是其他可以指定
pd.read_csv(data, sep='\t') # 制表符分隔 tab
pd.read_table(data) # read_table 默认是制表符分隔 tab

列、索引、名称

 # 默认第一行是表头,可以指定,如果指定列名会被忽略
pd.read_csv(data, header=0)
pd.read_csv(data, header=None) # 没有表头
pd.read_csv(data, names=['列1', '列2']) # 指定列名列表
# 如没列名,自动指定一个: 前缀加序数
pd.read_csv(data, prefix='c_', header=None)# 读取部分列
pd.read_csv(data, usecols=[0,4,3]) # 按索引只读取指定列,顺序无关
pd.read_csv(data, usecols=['列1', '列5']) # 按索引只读取指定列# 指定列顺序,其实是 df 的筛选功能
pd.read_csv(data, usecols=['列1', '列5'])[['列5', '列1']]
pd.read_csv(data, index_col=0) # 第几列是索引
# 以下用 callable 方式可以巧妙指定顺序, in 后边的是我们要的顺序
pd.read_csv(data, usecols=lambda x: x.upper() in ['COL3', 'COL1'])

数据类型

data = 'https://www.gairuo.com/file/data/dataset/GDP-China.csv'
# 指定数据类型
pd.read_csv(data, dtype=np.float64) # 所有数据均为此数据类型
pd.read_csv(data, dtype={'c1':np.float64, 'c2': str}) # 指定字段的类型# 解析日期时间
pd.read_csv(data, parse_dates=True) # 自动解析日期时间格式
pd.read_csv(data, parse_dates=['年份']) # 指定日期时间字段进行解析
# 将 1、4 列合并解析成名为 时间的 时间类型列
pd.read_csv(data, parse_dates={'时间':[1,4]})
# 指定时间解析库,默认是 dateutil.parser.parser
pd.read_csv(data, date_parser=pd.io.date_converters.parse_date_time)
date_parser=lambda x: pd.to_datetime(x, utc=True, format=...)

更多功能可参考 pandas.read_csv 详细使用。

导出文件

df.to_csv('done.csv')
df.to_csv('data/done.csv') # 可以指定文件目录路径
df.to_csv('done.csv', index=False) # 不要索引
# 导出二进制文件句柄(缓冲), 支持编码和压缩 pandas 1.2.0 增加
import io
buffer = io.BytesIO()
df.to_csv(buffer, encoding="utf-8", compression="gzip")

Excel 文件

read_excel() 方法可以使用 xlrd Python 模块(可能需要安装,下同)读取 Excel 2003(.xls)文件。 可以使用 xlrd 或 openpyxl 读取Excel 2007+(.xlsx)文件。 可以使用 pyxlsb 读取二进制Excel(.xlsb)文件。 to_excel() 实例方法用于将DataFrame 保存到Excel。 大多数用法类似于 csv,包括文件的读取和保存。

xlsx = pd.ExcelFile('data.xlsx')
df = pd.read_excel(xlsx, 'Sheet1') # 读取
xlsx.parse('sheet1') # 取指定标签为 DataFrame
# Excel 的所有标签
xlsx.sheet_names
# ['sheet1', 'sheet2', 'sheet3', 'sheet4']

文件读取

# Returns a DataFrame
pd.read_excel('team.xlsx') # 默认读取第一个标签页 Sheet
pd.read_excel('path_to_file.xls', sheet_name='Sheet1') # 指定 Sheet
# 从网址 url 读取
pd.read_excel('https://www.gairuo.com/file/data/dataset/team.xlsx')
# !!! 读取的功能基本与 read_csv 一样,可参考上文
# 不指定索引,不指定表头,使用自动行列索引
pd.read_excel('tmp.xlsx', index_col=None, header=None)
# 指定列的数据类型
pd.read_excel('tmp.xlsx', index_col=0,dtype={'Name': str, 'Value': float})

多个 Sheet 的读取:

pd.read_excel('path_to_file.xls', sheet_name=['Sheet1', 'Sheet2'])

ExcelFile 对象:

# 使用 ExcelFile 保存文件对象
xlsx = pd.ExcelFile('path_to_file.xls')
df = pd.read_excel(xlsx, 'Sheet1')# 可以把多个 Sheet 存入 ExcelFile
with pd.ExcelFile('path_to_file.xls') as xls:df1 = pd.read_excel(xls, 'Sheet1')df2 = pd.read_excel(xls, 'Sheet2')
df = pd.read_excel(xlsx)

常用的参数使用与 read_csv 相同。

导出 excel

df.to_excel('path_to_file.xlsx')
# 指定 sheet 名, 不要索引
df.to_excel('path_to_file.xlsx', sheet_name='Sheet1', index=False)
# 指定索引名,不合并单元格
df.to_excel('path_to_file.xlsx', index_label='label', merge_cells=False)
# 将多个 df 分不同 sheet 导入到一个 excel
with pd.ExcelWriter('path_to_file.xlsx') as writer:df1.to_excel(writer, sheet_name='Sheet1')df2.to_excel(writer, sheet_name='Sheet2')# 指定操作引擎
df.to_excel('path_to_file.xlsx', sheet_name='Sheet1', engine='xlsxwriter')
# By setting the 'engine' in the ExcelWriter constructor.
writer = pd.ExcelWriter('path_to_file.xlsx', engine='xlsxwriter')
df.to_excel(writer)
writer.save()# 设置系统引擎
from pandas import options  # noqa: E402
options.io.excel.xlsx.writer = 'xlsxwriter'
df.to_excel('path_to_file.xlsx', sheet_name='Sheet1')

JSON 格式

Pandas 可以读取和生成 Json 字符串,Series 或 DataFrame 都可以被转换。JSON 格式在网络上非常通用,在写爬虫时可以使用极大提高效率,在做可视化时前端的 JS 库往往需要接受 Json 格式。

读取 JSON

pd.read_json('data.json')
json = '''{"columns":["col 1","col 2"],
"index":["row 1","row 2"],
"data":[["a","b"],["c","d"]]}
'''
pd.read_json(json)
pd.read_json(json, orient='split') # json 格式
'''
orient 支持:
- '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}}
'''

输出 JSON

Series 或 DataFrame 转换 JSON 的机制如下:

  • Series :

    • 默认为 index
    • 支持 {split, records, index}
  • DataFrame

    • 默认为 columns
    • 支持 {split, records, index, columns, values, table}
df = pd.DataFrame([['a', 'b'], ['c', 'd']],index=['row 1', 'row 2'],columns=['col 1', 'col 2'])
# 输出 json 字符串
df.to_json(orient='split')

HTML

read_html() 函数可以接受 HTML字符串 / html文件 / URL,并将HTML表解析为DataFrame。返回的是一个 df 列表,可以通知索引取第几个。

仅解析网页内 <table> 标签里的数据。

dfs = pd.read_html('https://www.gairuo.com/p/pandas-io')
dfs[0] # 查看第一个 df
# 读取网页文件,第一行为表头
dfs = pd.read_html('data.html', header=0)
# 第一列为索引
dfs = pd.read_html(url, index_col=0)
# !!! 常用的功能与 read_csv 相同,可参考上文

如果一个网页表格很多,可以指定元素来取得:

# id='table' 的表格,注意这儿仍然可能返回多个
dfs1 = pd.read_html(url, attrs={'id': 'table'})
# dfs1[0]
# class='sortable'
dfs2 = pd.read_html(url, attrs={'class': 'sortable'})

常用的参数使用与 read_csv 相同。

输出 html

会输出 html 表格代码字符串。

print(df.to_html())
print(df.to_html(columns=[0])) # 输出指定列
print(df.to_html(bold_rows=False)) # 表头不加粗体
# 表格指定样式,支持多个
print(df.to_html(classes=['class1', 'class2']))

剪贴板 Clipboard

剪贴板(Clipboard)是操作系统级的一个暂存数据的地方,它存在内存中,可以在不同软件之间传递,非常方便。pandas 支持读取剪贴板中的结构化数据,这就意味着我们不用将数据保存成文件,直接从网页、文件中复制,然后中直接读取,非常方便。

读取剪贴板,它的参数使用与 read_csv 完全一样:

'''A B C
x 1 4 p
y 2 5 q
z 3 6 r
'''
# 复制上边的数据,然后直接赋值
cdf = pd.read_clipboard()

保存到剪贴板:

# 执行完找个地方粘贴一下看看效果
df = pd.DataFrame({'A': [1, 2, 3],'B': [4, 5, 6],'C': ['p', 'q', 'r']},index=['x', 'y', 'z'])
df.to_clipboard()

SQL

Pandas 支持连接数据库进行查询,有以下几个方法:

  • read_sql_table(table_name, con[, schema, …]), 把数据表里的数据转成 DataFrame
  • read_sql_query(sql, con[, index_col, …]), 用 sql 查询数据到 DataFrame
  • read_sql(sql, con[, index_col, …]), 同时支持上边两个功能
  • DataFrame.to_sql(self, name, con[, schema, …]),把记录数据写到数据库里
# 需要安装 sqlalchemy 库
from sqlalchemy import create_engine
# 创建数据库对象,sqlite 内存模式
engine = create_engine('sqlite:///:memory:')
# 把表名为 data 的表数据拿出来
with engine.connect() as conn, conn.begin():data = pd.read_sql_table('data', conn)# data
# 将数据写入
data.to_sql('data', engine)
# 大量写入
data.to_sql('data_chunked', engine, chunksize=1000)
# 使用 sql 查询
pd.read_sql_query('SELECT * FROM data', engine)

输出 Markdown

Markdown 是一种常用的技术文档编写语言,Pandas 支持输出 Markdown 格式字符串:

print(df.to_markdown())
'''
|    |   A |   B | C   |
|:---|----:|----:|:----|
| x  |   1 |   4 | p   |
| y  |   2 |   5 | q   |
| z  |   3 |   6 | r   |
'''# 不需要索引
print(df.to_markdown(index=False))
# 填充空值
print(df.fillna('').to_markdown(index=False))

Pandas 文件读取和导出相关推荐

  1. Pandas如何读取和导出 Excel、CSV、JSON 数据?

    转载自:Pandas如何读取和导出 Excel.CSV.JSON 数据? - 知乎 导入pandas等包 import pandas as pd import numpy as np import m ...

  2. pandas文件读取与存储

    pandas文件读取与存储 我们的数据大部分存在于文件当中,所以pandas会支持复杂的IO操作,pandas的API支持众多的文件格式,如CSV.SQL.XLS.JSON.HDF5. 注:最常用的H ...

  3. EasyExcel实现文件读取、导出、上传、下载操作

    一.EasyExcel简介 ​     Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度 ...

  4. Pandas数据分析02——各类文件的读取和导出

    参考书目:<深入浅出Pandas:利用Python进行数据处理与分析> ​ pandas真的很强大,几乎什么格式的数据 都能读取,什么csv,excel,spss,stata,json,h ...

  5. Python之读取MongoDB导出的BSON文件

    BSON是一种类似于JSON的二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型 ...

  6. python3行3列文件数据赋值_Python3快速入门(十四)——Pandas数据读取

    Python3快速入门(十四)--Pandas数据读取 一.DataFrame IO 1.CSV文件 pandas.read_csv(filepath_or_buffer, na_values='NA ...

  7. pandas中dataframe的构造(csv等结构化文件读取,字典读取)以及保存

    文章目录 前言 结构化文件读取 字典读取 numpy读取 保存dataframe 前言 pandas用来读取数据十分之方便和快速,可以提高你的效率,虽然numpy也有一些读取数据的api,但是通常我们 ...

  8. Pandas直接读取arff格式的文件,这种需求还是头一次碰到!

    作者/小小明 来源/快学Python 常规arff文件读取 之前有位群友遇到了arff格式的数据,却不知道怎么读取: 然后我让这位群友把文件发我,给我分析一下,我用文件编辑器打开后,发现格式如下: 只 ...

  9. 如何使用JavaScript实现纯前端读取和导出excel文件(转)

    转自小茗同学博客:https://www.cnblogs.com/liuxianan/p/js-excel.html js-xlsx 介绍 由SheetJS出品的js-xlsx是一款非常方便的只需要纯 ...

最新文章

  1. vs-halcon-大恒相机配置
  2. How is XSRF token retrieved from backend server
  3. .NET 6新特性试用 | 最小Web API
  4. NXP UWB NCJ29D5开发(二)BlinkyLed例程
  5. Redis学习总结(16)——Redis 集群的5种使用方式,及各自优缺点对比分析
  6. SaaS市场没有免费午餐!未来只有两种企业可生存
  7. ubuntu 安装 wkhtmltopdf 的方法
  8. android-应用签名
  9. r语言插补法_R语言之缺失值和异常值处理
  10. 微信扫二维码跳转网页链接如何制作
  11. 【FreeRTOS】02 任务的创建
  12. 公众号运营的小伙伴们看过来啦!
  13. 人脸识别技术及实现思路
  14. 定义bool型变量出现 ”identifier “bool” is undefined”错误
  15. 8个实用、强大、超厉害的软件推荐,快收藏吧!
  16. python数据库-6
  17. word选中所有图形
  18. 清华大学胡事民是计算机视觉,ResNet也能用在3D模型上了,清华「计图」团队新研究已开源...
  19. 你不得不知道的HashMap面试连环炮
  20. JS instanceof用法

热门文章

  1. 深度学习在搜索业务中的探索与实践 1
  2. Facebook也大干新闻聚合 “新闻快读”向所有媒体开放
  3. android Monkey 测试技巧
  4. 知方可补不足~数据库名称和数据库别名不同了怎么办
  5. Struts里面的配置笔记
  6. [转载] AUML——Schedules and Events
  7. javascript面向对象5
  8. 详解:设计模式之-单例设计模式
  9. 2010年寒假学习心得
  10. 基本程序 打印Scala的Hello World