将 Pandas 的 groupby 结果合并回 DataFrame

17

我有一个长这样的 DataFrame...

   idn value  
0  ID1    25
1  ID1    30
2  ID2    30
3  ID2    50

我想在这个表格中增加另一列,显示按'idn'分组后的最大'value'值。
我希望得到下面这样的结果。
   idn value  max_val
0  ID1    25       30
1  ID1    30       30
2  ID2    30       50
3  ID2    50       50

我可以使用类似以下方式的分组操作,提取 'value' 的最大值...

df[['idn', 'value']].groupby('idn')['value'].max()

然而,我无法将该结果合并回原始数据框中。

有什么最好的方法来获得所需的结果吗?

谢谢你。

3个回答

16

在分组对象上使用transform方法:

In [5]: df['maxval'] = df.groupby(by=['idn']).transform('max')

In [6]: df
Out[6]: 
   idn  value  maxval
0  ID1     25      30
1  ID1     30      30
2  ID2     30      50
3  ID2     50      50

2
.transform('max') 也是这个的快捷方式 :) - Andy Hayden
1
@AndyHayden lambda c: print('我喜欢lambda表达式') :) - Paul H

2

df的索引设置为idn,然后使用df.merge。合并后,重置索引并重命名列。

dfmax = df.groupby('idn')['value'].max()

df.set_index('idn', inplace=True)

df = df.merge(dfmax, how='outer', left_index=True, right_index=True)

df.reset_index(inplace=True)

df.columns = ['idn', 'value', 'max_value']

0

对于其他有兴趣的人,此问题的一行代码方法是使用reset_index。

具体如下:

df['value_max'] = df[['idn', 'value']].groupby('idn')['value'].max().reset_index(['idn', 'value'], drop = True)

这样做行不通。(...).reset_index(['idn', 'value'], drop=True)会返回一个错误,因为'value'不是索引的级别。此外,重置索引并不能获取旧索引,它只会创建一个新的索引。你可以通过类似于df['max'] = df.groupby('idn')['value'].max().reindex(df['idn']).set_axis(df.index)的方式来实现,但我不确定为什么你要这样做,相比起使用transform或者一开始就将'idn'设置为索引,这种方法可能并不理想。 - Matt Walck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接