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

Pandas三级多列索引分组计算两列差值返回全NaN问题求助

解决三级MultiIndex列DataFrame的组内L-S差值计算问题

首先,你遇到的全NaN问题,是因为在apply里使用xs后,返回的DataFrame索引和原groupby的结构在Pandas 0.21版本中无法正确对齐,导致结果全部为空。其实有更简单高效的方法来实现你的需求,甚至不需要用到groupby:

方法一:直接用xs提取列后相减(最简洁)

因为你的最底层列固定是L和S,我们可以直接提取所有L列和所有S列,Pandas会自动根据前两级索引完成对齐并计算差值:

net = test_df.xs('L', level='level_3', axis=1) - test_df.xs('S', level='level_3', axis=1)

执行后,net的列索引会保留前两级['level_1', 'level_2'],每一列就是对应组的L-S差值,完全符合你的需求。

方法二:修复groupby的apply逻辑

如果你坚持要用groupby实现,可以调整apply里的逻辑,确保返回的是一维Series(而非DataFrame),这样Pandas就能正确重组索引:

net = test_df.groupby(level=['level_1', 'level_2'], axis=1, group_keys=False).apply(
    lambda x: x.iloc[:, 0] - x.iloc[:, 1]
)

这里利用了每组固定只有两列(L在前、S在后)的特点,直接用iloc取第一列减第二列,返回的Series会自动关联到对应的前两级索引,不会出现NaN。

原代码出错原因分析

你之前的代码中,x.xs('L', ...)和x.xs('S', ...)返回的都是带有前两级索引的DataFrame,两者相减后得到的仍是同结构的DataFrame,但在Pandas 0.21的groupby.apply机制中,这样的返回值无法与原分组的索引结构正确对齐,最终导致所有值变为NaN。而返回一维Series则能避开这个对齐问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:24:37