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
相关产品推荐
相关产品推荐

