获取pandas GroupBy中最大值对应的行

Gio*_*oni 6 python group-by dataframe pandas pandas-groupby

简单数据框:

df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']})
df
   A  B  C
0  1  0  a
1  1  1  b
2  2  2  c
3  2  3  d
Run Code Online (Sandbox Code Playgroud)

我希望groupbyA 列的每个值 ( ) 都得到 C 列的值,B 列的值最大。例如对于A列的第1组,B列的最大值为1,所以我想要C列的值“b”:

   A  C
0  1  b
1  2  d
Run Code Online (Sandbox Code Playgroud)

无需假设 B 列已排序,性能是重中之重,其次是优雅。

WeN*_*Ben 9

sort_values+检查drop_duplicates

df.sort_values('B').drop_duplicates(['A'],keep='last')
Out[127]: 
   A  B  C
1  1  1  b
3  2  3  d
Run Code Online (Sandbox Code Playgroud)


Jon*_*oop 5

df.groupby('A').apply(lambda x: x.loc[x['B'].idxmax(), 'C'])
#    A
#1    b
#2    d
Run Code Online (Sandbox Code Playgroud)

使用idxmax找到其中索引B是最大的,然后选择列C该组内(使用λ-功能


cs9*_*s95 5

这里有一点关于groupbyand的乐趣nlargest

(df.set_index('C')
   .groupby('A')['B']
   .nlargest(1)
   .index
   .to_frame()
   .reset_index(drop=True))

   A  C
0  1  b
1  2  d
Run Code Online (Sandbox Code Playgroud)

或者,sort_valuesgroupby, 和last

df.sort_values('B').groupby('A')['C'].last().reset_index()

   A  C
0  1  b
1  2  d
Run Code Online (Sandbox Code Playgroud)