如何无数据丢失转换DataFrame?stack()用法及报错排查
宽表转长表的实现与报错排查
一、DataFrame转换的名称与正确实现
原始与目标格式
原始DataFrame:
A B C D x -2 3 y 1 -4 2 z 1 w 3 4 -2 -2目标转换格式:
x A 0 x B -2 x C 0 x D 3 y A 1 y B 0 y C -4 y D 2 z A 0 z B 0 z C 1 z D 0 w A 3 w B 4 w C -2 w D -2
转换名称
这个操作叫做宽表转长表(也称为逆透视/Unpivot),是将多列数据转换为多行键值对的常见数据格式转换操作。
代码问题与修正
你用stack()没得到预期结果,核心原因是读取数据时未将x/y/z/w所在的列设为索引,导致stack()把该列也当成了普通数据列进行转换,生成了多余的层级。
修正后的代码:
import pandas as pd # 读取Excel时直接将第一列设为行索引 catalogue_df = pd.read_excel('stack.xlsx', sheet_name='Sheet1', index_col=0) # 填充空值为0 catalogue_df = catalogue_df.fillna(0) # stack转换后重置索引,得到目标结构 trans_df = catalogue_df.stack().reset_index() # 重命名列名(可选,根据需求调整) trans_df.columns = ['行标识', '列标识', '数值'] # 保存Excel时用上下文管理器+close(),避免版本警告 with pd.ExcelWriter('from_stack.xlsx', engine='xlsxwriter') as writer: trans_df.to_excel(writer, sheet_name='Sheet1', index=False)
执行后即可得到你需要的三列格式,stack()只会处理A/B/C/D这些数据列,行索引(x/y/z/w)会保留为第一列的内容。
二、KeyError报错排查与解决
你遇到的错误KeyError: "None of ['ΠΕΡΙΟΧΗ'] are in the columns",原因很明确:当前DataFrame中不存在名为ΠΕΡΙΟΧΗ的列,可能的场景和解决方法如下:
先确认列名是否正确
先打印当前DataFrame的所有列名,检查是否拼写错误(包括大小写、特殊字符、空格):print(df.columns.tolist())如果列名实际是
ΠΕΡΙΟΧΗ(末尾带空格)或其他变体,修正set_index中的列名即可。该列实际是行索引
如果ΠΕΡΙΟΧΗ对应的内容是DataFrame的行索引,而非普通列,不需要调用set_index,直接执行后续操作:df = df.fillna(0).stack().to_frame().reset_index()读取数据时未正确加载该列
如果是读取CSV/Excel时没加载到该列,检查读取代码:- 读取CSV时确认表头行正确:
pd.read_csv('your_file.csv', header=0) - 读取Excel时确认指定了正确的工作表:
pd.read_excel('your_file.xlsx', sheet_name='正确工作表名')
- 读取CSV时确认表头行正确:
内容的提问来源于stack exchange,提问作者dimzev
相关产品推荐
相关产品推荐

