Python 单击groupby,然后按列的值(例如,最小值、最大值)选择一行

Python 单击groupby,然后按列的值(例如,最小值、最大值)选择一行,python,pandas,aggregate,Python,Pandas,Aggregate,假设我有一个数据帧 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中实现这一点 我不知道如何返回整行。比

假设我有一个数据帧

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();

这将只返回'Category'min(第1列)。

排序
,然后
。如果需要基于绝对值的单个最小行,请删除重复项

(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

这是一个计算效率更高的解决方案

TL;DR版本

df.loc[df.groupby('Category')['column1'].idxmin()]

欢迎来到堆栈溢出!请熟悉这些常见问题并重新发布您的问题——(1)如何创建一个最小、完整且可验证的示例——(2)为什么投票很重要?——快乐编码!!优雅美丽!谢谢