获取分组中具有最大值的行

2022-02-26 00:00:00 python pandas pandas-groupby

问题描述

我有一个根据id列分组的数据帧。对于每个组,我希望获得包含最大值的行(整行,而不仅仅是值)。我可以这样做:首先获取每个组的最大值,然后创建一个过滤数组,然后在原始数据帧上应用过滤。就像这样

import pandas as pd

# Dummy data
df = pd.DataFrame({'id' : [1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 4],
                   'other_value' : ['a', 'e', 'b', 'b', 'a', 'd', 'b', 'f' ,'a' ,'c', 'e', 'f'],
                   'value' : [1, 3, 5, 2, 5, 6, 2, 4, 6, 1, 7, 3]
                   })

# Get the max value in each group
df_max = df.groupby('id')['value'].max()

# Create row filter
row_filter = [df_max[i]==v for i, v in zip(df['id'], df['value'])]

# Filter
df_target = df[row_filter]
df_target
Out[58]: 
    id other_value  value
2    1           b      5
5    2           d      6
7    3           f      4
10   4           e      7

此解决方案有效,但不知何故似乎过于繁琐。有没有人知道更好的方法来做这件事。最好是眼线笔。关于可能的重复项,我将在稍后处理:)


解决方案

如果需要,请使用DataFrameGroupBy.idxmax仅选择一个最大值:

df = df.loc[df.groupby('id')['value'].idxmax()]
print (df)
    id other_value  value
2    1           b      5
5    2           d      6
7    3           f      4
10   4           e      7

如果有多个最大值并希望按max值搜索所有行:

df = pd.DataFrame({'id' : [1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 4],
                   'other_value' : ['a', 'e', 'b', 'b', 'a', 'd', 'b', 'f' ,'a' ,'c', 'e', 'f'],
                   'value' : [1, 3, 5, 2, 5, 6, 2, 4, 6, 1, 7, 7]
                   })

print (df)
    id other_value  value
0    1           a      1
1    1           e      3
2    1           b      5
3    2           b      2
4    2           a      5
5    2           d      6
6    3           b      2
7    3           f      4
8    4           a      6
9    4           c      1
10   4           e      7
11   4           f      7

df = df[df.groupby('id')['value'].transform('max') == df['value']]
print (df)
    id other_value  value
2    1           b      5
5    2           d      6
7    3           f      4
10   4           e      7
11   4           f      7

相关文章