Pandas多列索引分组时group_keys参数无效问题及解决需求
问题根源:误解了
group_keys的作用 你没看错文档,但用错场景了!group_keys=False这个参数是针对行分组的:当你对行做groupby并apply时,它控制是否把分组键作为结果的行索引的一部分。而你现在是对列做groupby,这个参数根本不会影响传入apply函数的DataFrame的列结构,所以自然没效果。
无需修改
foo的解决方案 要实现你要的效果,不用动foo函数,只需要在apply的时候加一层匿名函数包装,先把传入子DataFrame的列索引去掉feat_1层级再传给foo就行:
import numpy as np import pandas as pd data = {'A': pd.DataFrame(np.random.randn(100, 5)), 'B': pd.DataFrame(np.random.randn(100, 5)), 'C': pd.DataFrame(np.random.randn(100, 5))} data = pd.concat(data, axis=1, names=['feat_1', 'feat_2']) def foo(df): print(df.columns) return df.sum(1) # 修正后的代码 result = data.groupby(level=['feat_1'], axis=1).apply(lambda sub_df: foo(sub_df.droplevel('feat_1', axis=1)))
运行这段代码后,你会看到打印的列索引就是期望的Int64Index([0, 1, 2, 3, 4], dtype='int64')(和你要的[0,1,2,3,4]是同一个意思),完全符合需求。
补充说明
在pandas 0.20.3这个版本里,对列做groupby时,默认会把完整的MultiIndex列传给apply的函数,没有直接的参数可以跳过这个行为(哪怕是后续更高版本的pandas也没加这个开关),所以用匿名函数提前剥离不需要的列层级是最省心的方式,还能保留你原有的foo函数逻辑不变。
内容的提问来源于stack exchange,提问作者FLab
相关产品推荐
相关产品推荐

