熊猫:按组在另一列中创建包含相应最大值最大值的新列

时间:2020-02-20 14:55:05

标签: python pandas dataframe

我想创建一个新的列,其中包含按组在另一列中的最大值的对应值。最好用示例来解释:

data = {'group':['g1', 'g1', 'g1', 'g1', 'g1', 'g1', 'g2', 'g2', 'g2', 'g2', 'g2'], 
                    'A':[3, 1, 8, 2, 6, -1, 0, 13, -4, 0, 1], 
                    'B':[5, 2, 3, 7, 11, -1, 4,-1, 1, 0, 2]} 
df = pd.DataFrame(data)
df

以下解决方案是一种捷径,但我觉得有更好的方法可以实现:

df.loc[:, 'Amax'] = df.loc[df.groupby('group')['B'].idxmax(), 'A']
df.loc[:, 'Amax'] = df.groupby('group')['Amax'].transform('median')

   group   A   B  Amax
0     g1   3   5   6.0
1     g1   1   2   6.0
2     g1   8   3   6.0
3     g1   2   7   6.0
4     g1   6  11   6.0
5     g1  -1  -1   6.0
6     g2   0   4   0.0
7     g2  13  -1   0.0
8     g2  -4   1   0.0
9     g2   0   0   0.0
10    g2   1   2   0.0

2 个答案:

答案 0 :(得分:6)

使用transform

df['Amax']=df.loc[df.groupby('group')['B'].transform('idxmax'),'A'].values
df
Out[42]: 
   group   A   B  Amax
0     g1   3   5     6
1     g1   1   2     6
2     g1   8   3     6
3     g1   2   7     6
4     g1   6  11     6
5     g1  -1  -1     6
6     g2   0   4     0
7     g2  13  -1     0
8     g2  -4   1     0
9     g2   0   0     0
10    g2   1   2     0

答案 1 :(得分:4)

DataFrame.set_indexGroupBy.transform一起使用,但是由于索引是由Series.to_numpy创建的分配数组不同:

df['Amax'] = df.set_index('A').groupby('group')['B'].transform('idxmax').to_numpy()
print(df)
   group   A   B  Amax
0     g1   3   5     6
1     g1   1   2     6
2     g1   8   3     6
3     g1   2   7     6
4     g1   6  11     6
5     g1  -1  -1     6
6     g2   0   4     0
7     g2  13  -1     0
8     g2  -4   1     0
9     g2   0   0     0
10    g2   1   2     0