簡體   English   中英

pandas groupby,然后按列的值選擇一行(例如,最小值、最大值)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM