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

