Python:删除每组中具有最大值的行

Posted

技术标签:

【中文标题】Python:删除每组中具有最大值的行【英文标题】:Python: remove rows with max value in each group 【发布时间】:2018-12-19 17:42:07 【问题描述】:

我有一个这样的熊猫数据框df

In [1]: df
Out[1]:
      country     count
0       Japan        78
1       Japan        80
2         USA        45
3      France        34
4      France        90
5          UK        45
6          UK        34
7       China        32
8       China        87
9      Russia        20
10      Russia        67

我想删除每组中具有最大值的行。所以结果应该是这样的:

      country     count
0       Japan        78
3      France        34
6          UK        34
7       China        32
9      Russia        20

我的第一次尝试:

idx = df.groupby(['country'], sort=False).max()['count'].index
df_new = df.drop(list(idx))

我的第二次尝试:

idx = df.groupby(['country'])['count'].transform(max).index
df_new = df.drop(list(idx))

但它没有用。有什么想法吗?

【问题讨论】:

【参考方案1】:

groupby/transform('max')

您可以先按组计算一系列最大值。然后过滤掉 count 等于该系列的实例。请注意,这也会删除重复的最大值。

g = df.groupby(['country'])['count'].transform('max')
df = df[~(df['count'] == g)]

g 系列表示每行按组的最大值。如果这等于 df['count'](按索引),则您有一行,其中您的组有最大值。然后,您使用~ 作为否定条件。

print(df.groupby(['country'])['count'].transform('max'))

0    80
1    80
2    45
3    90
4    90
5    45
6    45
7    87
8    87
9    20
Name: count, dtype: int64

排序 + 删除

或者,您可以排序并删除最后的匹配项:

res = df.sort_values('count')
res = res.drop(res.groupby('country').tail(1).index)

print(res)

  country  count
9  Russia     20
7   China     32
3  France     34
6      UK     34
0   Japan     78

【讨论】:

以上是关于Python:删除每组中具有最大值的行的主要内容,如果未能解决你的问题,请参考以下文章

在特定列 postgres 中选择具有最大值的组中的行

从Oracle SQL中的每个组中选择具有最大值的行[重复]

从每组中的 3 个表中选择 sql 中具有最新日期的行

mysql - 为每组分组的 SQL 结果获取具有最大值的记录[重复]

Excel—分组然后取每组中对应时间列值最大的或者最小的

sql 分组后求每组中的最大值对应的那条数据