pandas groupby然后按列的值选择一行(例如,min,max)

问题描述 投票:1回答:2

假设我有一个数据帧

Category Data1 column1
A 'SOMEDATA' 10
A 'SOMEDATA' 2
A 'SOMEDATA' -10
B 'SOMEDATA' 10
B 'SOMEDATA' 1
B 'SOMEDATA' -10

等等

我想按列值选择每组中的一行。例如,ABS(第1列)

因此产生的数据是

Category Data1 column1
A 'SOMEDATA' 2
B 'SOMEDATA'  1

我怎么能在python中这样做?

我无法弄清楚如何返回整行。例如,

df.groupby('Category')['column1'].min();

这只会返回'类别'min(column1)。

python pandas aggregate
2个回答
1
投票

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

排序只能对现有列进行排序,因此我们需要创建绝对值列(使用.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
© www.soinside.com 2019 - 2024. All rights reserved.