You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无数据丢失转换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中不存在名为ΠΕΡΙΟΧΗ的列,可能的场景和解决方法如下:

  1. 先确认列名是否正确
    先打印当前DataFrame的所有列名,检查是否拼写错误(包括大小写、特殊字符、空格):

    print(df.columns.tolist())
    

    如果列名实际是ΠΕΡΙΟΧΗ (末尾带空格)或其他变体,修正set_index中的列名即可。

  2. 该列实际是行索引
    如果ΠΕΡΙΟΧΗ对应的内容是DataFrame的行索引,而非普通列,不需要调用set_index,直接执行后续操作:

    df = df.fillna(0).stack().to_frame().reset_index()
    
  3. 读取数据时未正确加载该列
    如果是读取CSV/Excel时没加载到该列,检查读取代码:

    • 读取CSV时确认表头行正确:pd.read_csv('your_file.csv', header=0)
    • 读取Excel时确认指定了正确的工作表:pd.read_excel('your_file.xlsx', sheet_name='正确工作表名')

内容的提问来源于stack exchange,提问作者dimzev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:02:56