如何用Python从Excel数据透视表中提取列数据?
问题描述
我尝试用Python Pandas提取Excel工作表中数据透视表的全部数据,想获取透视表的所有列。使用DataFrame.get("列名")会抛出Key Error,但用"Unnamed: 1"这类名称却能取到数据。我需要把提取的数据保存成普通表格格式的电子表格,方便制作图表等操作。
示例代码:
df = pd.read_excel(filename.xlsx) print(df.columns)
输出:
Index(['2023', 'Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4', 'Unnamed: 5', 'Unnamed: 6', 'Unnamed: 7', 'Unnamed: 8', 'Unnamed: 9', 'Unnamed: 10', 'Unnamed: 11', 'Unnamed: 12', 'Unnamed: 13', 'Unnamed: 14', 'Unnamed: 15', 'Unnamed: 16', 'Unnamed: 17', 'Unnamed: 18', 'Unnamed: 19'], dtype='object')
问题原因是带筛选器的数据透视表,read_excel默认将第一行识别为列名,但该行并非透视表的实际列名。
解决方案
方法1:指定表头所在行
先打开Excel确认透视表实际表头的行号(比如实际表头在第2行,对应pandas的索引为1),用header参数指定表头行:
import pandas as pd # 假设实际表头位于Excel第2行,设置header=1(pandas索引从0开始) df = pd.read_excel("filename.xlsx", header=1) print(df.columns)
执行后即可正确读取透视表的实际列名,后续可直接通过列名调取数据。
方法2:手动重命名列
若透视表表头存在合并单元格或特殊格式,可先读取数据再手动设置列名:
import pandas as pd # 跳过错误的第一行列名 df = pd.read_excel("filename.xlsx", skiprows=1) # 替换为透视表的真实列名 df.columns = ["年份", "产品A", "产品B", "产品C", ...]
方法3:处理多级复合表头
如果透视表是多级复合表头(行列均有分组),可指定多行作为表头,再合并为单级列名:
import pandas as pd # 假设表头占用Excel第1、2行,对应pandas索引0和1 df = pd.read_excel("filename.xlsx", header=[0, 1]) # 合并多级表头为单级列名 df.columns = ['_'.join(col).strip() for col in df.columns.values]
保存整理后的数据
处理完列名后,直接保存为普通表格:
df.to_excel("整理后的数据.xlsx", index=False)
内容的提问来源于stack exchange,提问作者Srinivasan
相关产品推荐
相关产品推荐

