Pandas:如何select按键分组的一系列行的最小值
Pandas: How to select the minimum value of a series of rows grouped by a key
假设我有以下数据框:
Key | Amount | Term | Other | Other_2
----+--------+--------+-------+--------
A | 9999 | Short | ABC | 100
A | 261 | Short | ABC | 100
B | 281 | Long | CDE | 200
C | 140 | Long | EFG | 300
C | 9999 | Long | EFG | 300
所需的输出应该是:
Key | Amount | Term | Other | Other_2
----+--------+--------+-------+--------
A | 261 | Short | ABC | 100
B | 281 | Long | CDE | 200
C | 140 | Long | EFG | 300
也就是说,取 "Amount" 列的最小值,同时保留具有最小值的行中的其余值。
我认为这可以通过 groupby() 来完成,但我不知道如何实现。
编辑:我删除了逗号,我的数据是数字
要获取每个键内的最小值,您可以使用groupby.apply
创建一个布尔系列,其中最小值取真,其他值取假;然后你可以使用布尔系列进行子集化:
df[df.Amount.groupby(df.Key).apply(lambda x: x == x.min())]
# Key Amount Term Other Other_2
#1 A 261 Short ABC 100
#2 B 281 Long CDE 200
#3 C 140 Long EFG 300
您可以在每个子组上使用 nsmallest()
方法的另一个选项,在这里您可以采用按 Amount
:
排序的最小行
df.groupby("Key", group_keys=False).apply(lambda g: g.nsmallest(1, "Amount"))
# Key Amount Term Other Other_2
#1 A 261 Short ABC 100
#2 B 281 Long CDE 200
#3 C 140 Long EFG 300
假设我有以下数据框:
Key | Amount | Term | Other | Other_2
----+--------+--------+-------+--------
A | 9999 | Short | ABC | 100
A | 261 | Short | ABC | 100
B | 281 | Long | CDE | 200
C | 140 | Long | EFG | 300
C | 9999 | Long | EFG | 300
所需的输出应该是:
Key | Amount | Term | Other | Other_2
----+--------+--------+-------+--------
A | 261 | Short | ABC | 100
B | 281 | Long | CDE | 200
C | 140 | Long | EFG | 300
也就是说,取 "Amount" 列的最小值,同时保留具有最小值的行中的其余值。
我认为这可以通过 groupby() 来完成,但我不知道如何实现。
编辑:我删除了逗号,我的数据是数字
要获取每个键内的最小值,您可以使用groupby.apply
创建一个布尔系列,其中最小值取真,其他值取假;然后你可以使用布尔系列进行子集化:
df[df.Amount.groupby(df.Key).apply(lambda x: x == x.min())]
# Key Amount Term Other Other_2
#1 A 261 Short ABC 100
#2 B 281 Long CDE 200
#3 C 140 Long EFG 300
您可以在每个子组上使用 nsmallest()
方法的另一个选项,在这里您可以采用按 Amount
:
df.groupby("Key", group_keys=False).apply(lambda g: g.nsmallest(1, "Amount"))
# Key Amount Term Other Other_2
#1 A 261 Short ABC 100
#2 B 281 Long CDE 200
#3 C 140 Long EFG 300