groupby 和 select 模式并加入原始数据帧

groupby and select mode and join back onto original dataframe

我有这样的数据:

df = pd.DataFrame({'Name' : ['John', 'John', 'John', 'Darrel','Darrel', 'Nick'], 
                  'Ocupation' : ['An','An', 'An', 'Se', 'So', 'Ik'],
                  'Numbers' : ['12','12','54','2', '3', '55']})

我想按 Name 分组,对于 Name 中的每个组,我想 select Numbers 的模式(最大 frequent/prevalent 值) .我使用以下代码执行此操作:

df.groupby(['Name'])['Numbers'].agg(lambda x: pd.Series.mode(x)[0]).reset_index(False)

,现在我想将这些模式重新加入 df。有什么办法一次性搞定吗?

现在我要做的可能不是那么优雅:

df.merge(df.groupby(['Name'])['Numbers'].agg(lambda x: pd.Series.mode(x)[0]).reset_index(False),
       left_on='Name', right_on='Name', how = 'left')

如果你想要模式,你可以使用:

from statistics import mode
df['Mode'] = df.groupby(['Name'])['Numbers'].transform(mode)

使用groupby().transform()代替groupby().agg():

df['Mode'] = df.groupby('Name')['Numbers'].transform(lambda x: x.mode()[0])

输出:

     Name Ocupation Numbers Mode
0    John        An      12   12
1    John        An      12   12
2    John        An      54   12
3  Darrel        Se       2    2
4  Darrel        So       3    2
5    Nick        Ik      55   55