如何在Pandas DataFrame中按id分组后为每行添加组内最大值列
解决Pandas分组后填充最大值到每行的问题
我来帮你搞定这个问题!你想要的是按id分组后,把每组value列的最大值填充到该组的每一行中,之前的两种写法问题出在这儿:
为什么之前的写法不对?
- 用
df.groupby(['id'])['value'].idxmax():这个方法返回的是每组中value最大值对应的行索引位置,而不是最大值本身,所以你得到的会是类似0、3、5这样的索引数字,不是你需要的0或1。 - 直接用
df.groupby(['id'])['value'].max():这个会生成一个以id为索引的Series,但原DataFrame的索引是默认的连续数字(0、1、2...),直接赋值时Pandas会按索引匹配,导致大部分行匹配不到对应值,结果会出现大量NaN或者错误的填充。
正确的解法:使用transform方法
transform方法专门用来处理这种“分组计算后,把结果广播回原数据每一行”的需求,它会保持原数据的行数和索引,完美匹配你的需求:
import pandas as pd # 你的原始数据 df = pd.DataFrame({ 'id': [1,1,1,2,2,3,3], 'value': [0,0,0,0,1,1,1] }) # 添加新列的正确代码 df['new_column'] = df.groupby('id')['value'].transform('max') print(df)
运行后得到的结果正好是你预期的:
id value new_column 0 1 0 0 1 1 0 0 2 1 0 0 3 2 0 1 4 2 1 1 5 3 1 1 6 3 1 1
transform还支持其他聚合函数,比如mean()、sum(),如果你需要分组后计算其他统计量并填充到每行,用它就对了!
内容的提问来源于stack exchange,提问作者Lucas Dresl
相关产品推荐
相关产品推荐

