我想创建一个新的列,其中包含按组在另一列中的最大值的对应值。最好用示例来解释:
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
答案 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_index
与GroupBy.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