Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取分组中具有最大值的行_Python_Pandas_Pandas Groupby - Fatal编程技术网

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

Python 获取分组中具有最大值的行,python,pandas,pandas-groupby,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',

我有一个数据帧,我根据
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
这个解决方案是可行的,但不知何故似乎过于繁琐。有谁知道更好的方法吗。最好是单行线。关于潜在的重复项,我将在以后处理:)

如果需要,使用只选择一个最大值:

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