用Pandas分组筛选后为何无法获取每组指定列的最大值?
问题分析与解决方法
错误原因
你之前的操作中,df.groupby(['team']).apply(lambda g: g[g['another_variable'] == 1])返回的是一个多层索引的DataFrame,此时直接调用.variable.min()是对整个variable列取最小值,而非按每个team分组计算,所以只会得到一个单一值。
正确实现方式
方法1:在apply内部完成分组计算
直接在lambda函数里对每个分组筛选后取variable的最大值,这样apply会返回每个组对应的结果,最终得到一个以team为索引的Series:
result = df.groupby('team').apply(lambda g: g[g['another_variable'] == 1]['variable'].max()) print(result) # 输出: # team # A 10 # B 3 # dtype: int64
方法2:先筛选再分组(更高效)
先过滤出another_variable == 1的行,再按team分组取variable的最大值,这种方式比apply更高效,尤其是处理大数据集时:
result = df[df['another_variable'] == 1].groupby('team')['variable'].max() print(result) # 输出同上
方法3:使用agg结合条件
通过groupby.agg方法,指定条件计算逻辑,同样能得到每个组的目标值:
result = df.groupby('team').agg( max_var=('variable', lambda x: x[df.loc[x.index, 'another_variable'] == 1].max()) ) print(result) # 输出: # max_var # team # A 10 # B 3
如果之后需要计算这些最大值的整体最大值,直接对结果调用.max()即可:
overall_max = result.max() print(overall_max) # 输出10
内容的提问来源于stack exchange,提问作者Maxim Moloshenko
相关产品推荐
相关产品推荐

