Pandas 文件读取和导出
发布日期:2021-05-07 03:20:50 浏览次数:37 分类:精选文章

本文共 7330 字,大约阅读时间需要 24 分钟。

Pandas 文件读取和导出

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

说明

修订中,欢迎加微信 sinbam 提供建议、纠错、催更。查看

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

 

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

功能列表

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

格式 文件格式 读取函数 写入(输出)函数
binary Excel to_excel
text 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# 使用网址 urlpd.read_csv('https://www.gairuo.com/file/data/dataset/GDP-China.csv')# 也可以从 StringIO 中读取from io import StringIOdata = ('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') # 制表符分隔 tabpd.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.parserpd.read_csv(data, date_parser=pd.io.date_converters.parse_date_time)date_parser=lambda x: pd.to_datetime(x, utc=True, format=...)

更多功能可参考 。

导出文件

df.to_csv('done.csv')df.to_csv('data/done.csv') # 可以指定文件目录路径df.to_csv('done.csv', index=False) # 不要索引# 导出二进制文件句柄(缓冲), 支持编码和压缩 pandas 1.2.0 增加import iobuffer = 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 DataFramepd.read_excel('team.xlsx') # 默认读取第一个标签页 Sheetpd.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 存入 ExcelFilewith 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)

常用的参数使用与  相同。

导出 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 导入到一个 excelwith 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: E402options.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'})

常用的参数使用与  相同。

输出 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 支持读取剪贴板中的结构化数据,这就意味着我们不用将数据保存成文件,直接从网页、文件中复制,然后中直接读取,非常方便。

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

'''  A B Cx 1 4 py 2 5 qz 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

 是一种常用的技术文档编写语言,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))
上一篇:TensorFlow 2.0 mnist手写数字识别(CNN卷积神经网络)
下一篇:Pandas 统计分析基础 笔记4 任务4.4 使用分组聚合进行组内计算

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月05日 21时07分22秒