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

Python中使用stack()堆叠DataFrame异常问题求助

解决Pandas stack()后出现大量NA并得到目标长格式的问题

看起来你是想把宽格式的DataFrame转换成预期的长格式,但stack()的默认输出让你困惑了。别担心,我来帮你理清问题并解决它。

先还原你的数据场景

我先模拟你的原始DataFrame结构,方便后续演示:

import pandas as pd

# 模拟你的原始数据
data = {
    'BE': [0.0706, 38.8601, 0],
    'BG': [0, 0.0001, 95.2664],
    'CZ': [0.3879, 0.0233, 0]
}
df = pd.DataFrame(data, index=['AT_CPA_A02', 'BE_CPA_A02', 'BG_CPA_A02'])

你的问题根源

你执行df.stack()后看到的带NA的结果,大概率是因为你查看结果的方式导致的误解——stack()本身会返回一个多级索引的Series,如果后续误执行了unstack(),或者查看工具自动格式化了输出,就会出现那种带NA的宽格式。另外,如果你的原始DataFrame本身存在缺失值,stack()也会保留这些NA项。

得到你期望格式的解决方案

要得到ID + Country + Val.的长格式,只需要对stack()的结果做简单处理,或者用更直观的宽转长工具:

方法1:用stack() + 重置索引

# 堆叠数据,过滤缺失值(如果原始数据有NA的话),然后重置索引
result = df.stack().dropna().reset_index()
# 重命名列名到你想要的格式
result.columns = ['ID', 'Country', 'Val.']

方法2:用melt()(更直观的宽转长方法)

如果你觉得stack()的多级索引有点绕,melt()函数可以直接实现你的需求:

# 先把行索引转成列,再执行宽转长
result = df.reset_index().melt(
    id_vars='index',  # 保留作为标识的列(原行索引)
    var_name='Country',  # 原列名对应的新列名
    value_name='Val.'  # 原数值对应的新列名
)
# 把原索引列的名字改成你想要的ID
result.rename(columns={'index': 'ID'}, inplace=True)

两种方法最终都会得到你期望的格式:

ID Country    Val.
0  AT_CPA_A02      BE   0.0706
1  BE_CPA_A02      BE  38.8601
2  BG_CPA_A02      BE   0.0000
3  AT_CPA_A02      BG   0.0000
4  BE_CPA_A02      BG   0.0001
5  BG_CPA_A02      BG  95.2664
6  AT_CPA_A02      CZ   0.3879
7  BE_CPA_A02      CZ   0.0233
8  BG_CPA_A02      CZ   0.0000

额外提示

如果你的原始DataFrame确实没有NA,但执行stack()后还是看到了NA,检查一下代码有没有多执行不必要的操作——比如不小心对堆叠后的结果调用了unstack(),就会变回带NA的宽格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:37:28