![](/img/trans.png)
[英]How to select row with max value in column from pandas groupby() groups?
[英]pandas groupby and then select a row by value of column (min,max, for example)
假設我有一個數據框
Category Data1 column1
A 'SOMEDATA' 10
A 'SOMEDATA' 2
A 'SOMEDATA' -10
B 'SOMEDATA' 10
B 'SOMEDATA' 1
B 'SOMEDATA' -10
等等
我想按列值在每個組中選擇一行。 例如,ABS(column1)
所以結果數據是
Category Data1 column1
A 'SOMEDATA' 2
B 'SOMEDATA' 1
我怎么能在python中做到這一點?
我不知道如何返回整行。 例如,
df.groupby('Category')['column1'].min();
這只會返回 'Category' min(column1) 。
這是一個計算效率更高的解決方案。
TL;DR 版本
df.loc[df.groupby('Category')['column1'].idxmin()]
sort
然后.drop_duplicates
,如果你想要基於絕對值的單個最小行。
(df.assign(to_sort = df.column1.abs()).sort_values('to_sort')
.drop_duplicates('Category').drop(columns='to_sort'))
Category Data1 column1
4 B 'SOMEDATA' 1
1 A 'SOMEDATA' 2
Sort 只能對現有列進行排序,因此我們需要創建絕對值列(使用.assign
)。 然后排序確保最小絕對值首先出現,刪除重復項保留每個類別的第一行,現在是最小絕對值行。
也可以使用groupby
,如果您需要為每組返回多於一行,則更好:
df.assign(to_sort = df.column1.abs()).sort_values('to_sort').groupby(df.Category).head(1)
或者,您可以使用groupby
的結果切片。 這在您想要返回與最小值匹配的所有行的情況下很有用:
df[df.groupby(df.Category, group_keys=False).apply(lambda x: x.column1 == x.column1.abs().min())]
Category Data1 column1
1 A 'SOMEDATA' 2
4 B 'SOMEDATA' 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.