Python:基于组内的最大值创建新列,但使用附加(字符串)列中的值

Python:基于组内的最大值创建新列,但使用附加(字符串)列中的值,python,pandas,Python,Pandas,我有一个包含以下内容的熊猫数据框: import pandas as pd df = pd.DataFrame({'group_id': [1,1,2,2], 'name':['Arthur','Bob','Caroline','Denise'], 'income': [40000, 20000,50000,60000] }) df Out[94]: group_id

我有一个包含以下内容的熊猫数据框:

import pandas as pd

df = pd.DataFrame({'group_id': [1,1,2,2], 
                   'name':['Arthur','Bob','Caroline','Denise'],
                   'income': [40000, 20000,50000,60000]
                   })

df
Out[94]: 
   group_id      name  income
0         1    Arthur   40000
1         1       Bob   20000
2         2  Caroline   50000
3         2    Denise   60000

我期望的输出是在组id中有收入最高者的姓名,例如:

df
Out[94]: 
   group_id      name  income   highest_income_name
0         1    Arthur   40000                Arthur
1         1       Bob   20000                Arthur
2         2  Caroline   50000                Denise
3         2    Denise   60000                Denise

根据我实际数据的数据生成过程,在一个收入最高的组中,始终只有一个名称

生成上述内容的最佳实践方式是什么

如果我试着填写最大收入,然后找到名字,我会被NaN困住,我可能会尝试填写,但会增加复杂性

df['max_income'] = df.groupby('group_id')['income'].transform('max')
df['highest_income_name'] = df['name'][df['income']==df['max_income']]

df
Out[105]: 
   group_id      name  income  max_income highest_income_name
0         1    Arthur   40000       40000              Arthur
1         1       Bob   20000       40000                 NaN
2         2  Caroline   50000       60000                 NaN
3         2    Denise   60000       60000              Denise
用于:


获取groupby中的最大收入指数。如果有两个收入最高的人,那么使用ilocwhat获取姓名?根据我实际数据的数据生成过程,在一个收入最高的组中,始终只有一个姓名,因此我可以检查这是否属实,然后不必处理有平局的情况。upvoces,很好的答案!。。。这里的max是否不阻止这种矢量化操作?
In [287]: import numpy as np

In [302]: df['highest_income_name'] = np.where(df.income.eq(df.groupby('group_id')['income'].transform(max)), df.name, np.nan)

In [308]: df['highest_income_name'] = df.groupby('group_id')['highest_income_name'].transform('first')

In [309]: df
Out[309]: 
   group_id      name  income highest_income_name
0         1    Arthur   40000              Arthur
1         1       Bob   20000              Arthur
2         2  Caroline   50000              Denise
3         2    Denise   60000              Denise