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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:29:46