如何解析ipynb中输出的带双行表头的pandas DataFrame纯文本表格
打印输出的pandas DataFrame纯文本解析方案
针对print()输出的pandas DataFrame纯文本解析,除pandas.read_fwf()外,更通用优雅的方案是配合StringIO和read_csv的正则分隔符实现,可适配几乎所有常规打印的DataFrame格式:
单索引表格(示例表格1)解析代码
import pandas as pd from io import StringIO table1_text = """ Name Discipline NOC United States of America 615 615 Japan 586 586 Australia 470 470 People's Republic of China 401 401 Germany 400 400 """ df = pd.read_csv( StringIO(table1_text), sep=r'\s{2,}', # 匹配连续2个及以上空格作为分隔符,避免列内容里的空格被误拆分 engine='python', skipinitialspace=True, index_col=0 # 指定第一列为索引 )
多级索引表格(示例表格2)解析代码
table2_text = """ Name NOC Discipline United States of America Athletics 144 Germany Athletics 95 Great Britain Athletics 75 Italy Athletics 73 Japan Athletics 70 Bermuda Triathlon 1 Libya Athletics 1 Palestine Athletics 1 San Marino Swimming 1 Kiribati Athletics 1 """ df = pd.read_csv( StringIO(table2_text), sep=r'\s{2,}', engine='python', skipinitialspace=True, index_col=[0,1] # 指定前两列为多级索引 )
带行号普通表格(示例表格3)解析代码
table3_text = """ Name NOC Discipline 1410 CA Liliana Portugal Athletics 1411 CABAL Juan-Sebastian Colombia Tennis 1412 CABALLERO Denia Cuba Athletics 1413 CABANA PEREZ Cristina Spain Judo 1414 CABECINHA Ana Portugal Athletics """ df = pd.read_csv( StringIO(table3_text), sep=r'\s{2,}', engine='python', skipinitialspace=True, index_col=0 # 指定第一列的行号为索引 )
pandas默认打印结果无法直接解析的设计说明
该设计符合pandas的功能定位,不属于不合理设计:
- 打印输出的核心定位是人类可读,而非机器可解析,优先保证终端、notebook等场景下的展示美观度,会自动适配窗口宽度、截断过长内容、合并重复索引值,这些优化都会破坏机器解析的一致性
- pandas本身提供了专门的机器可交换格式输出接口,比如
df.to_csv()、df.to_json()、df.to_pickle()等,专门用于数据持久化和传输场景,不需要依赖打印输出做数据传递 - 如果需要打印的内容也支持直接解析,可以自定义打印格式,比如配置pandas参数输出兼容解析的格式:
# 直接打印制表符分隔的可解析内容 print(df.to_csv(sep='\t', na_rep='nan'))
内容的提问来源于stack exchange,提问作者Zohar Levi
相关产品推荐
相关产品推荐

