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

Mak*_*aki 2 python indexing dataframe pandas pandas-groupby

我有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
Run Code Online (Sandbox Code Playgroud)

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

      country     count
0       Japan        78
3      France        34
6          UK        34
7       China        32
9      Russia        20
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试:

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

我的第二次尝试:

idx = df.groupby(['country'])['count'].transform(max).index
df_new = df.drop(list(idx))
Run Code Online (Sandbox Code Playgroud)

但它没有用.有任何想法吗?

jpp*_*jpp 6

groupby/transform('max')

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

g = df.groupby(['country'])['count'].transform('max')
df = df[~(df['count'] == g)]
Run Code Online (Sandbox Code Playgroud)

该系列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
Run Code Online (Sandbox Code Playgroud)

排序+下降

或者,您可以对最终事件进行排序和删除:

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
Run Code Online (Sandbox Code Playgroud)