假设我有一个数据帧
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)。
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