从 groupby 中选择具有最高值的行

Rya*_*ack 6 python pandas

我有一个数据框,其中包含有关用户的一些信息。有一列用于用户,一列用于类型,一列用于计数,如下所示:

name         type     count
robert       x        123
robert       y        456
robert       z        5123
charlie      x        442123
charlie      y        0 
charlie      z        42
Run Code Online (Sandbox Code Playgroud)

我试图找出每个名称的计数最高的类型,所以对于这种情况,我想选择这个:

name         type    count
robert       z       5123
charlie      x       442123
Run Code Online (Sandbox Code Playgroud)

我知道我可以做这样的事情来获得每个名称的最大计数,但我不确定如何包含“类型”列,这实际上是最重要的

df.sort_values('count', ascending=False).drop_duplicates('name').sort_index()
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!

ayo*_*rgo 5

尝试这个

df.loc[df.groupby('name')['count'].idxmax()]['type']
Run Code Online (Sandbox Code Playgroud)

      name type   count
3  charlie    x  442123
2   robert    z    5123
Run Code Online (Sandbox Code Playgroud)

如果您不仅想要一个最大值,而且想要n每个组的最高值,您可以这样做(例如n = 2

df.loc[df.groupby('name')['count'].nlargest(2).index.get_level_values(1)]
Run Code Online (Sandbox Code Playgroud)

      name type   count
3  charlie    x  442123
5  charlie    z      42
2   robert    z    5123
1   robert    y     456
Run Code Online (Sandbox Code Playgroud)


Ste*_*del 5

只需按名称排序并计数,按名称分组并保留在第一位即可。

df.sort_values(['name', 'count'],ascending=False).groupby(['name']).first().reset_index()
Run Code Online (Sandbox Code Playgroud)

会给你:

    name type   count
3  charlie    x  442123
2   robert    z    5123
Run Code Online (Sandbox Code Playgroud)


Sco*_*ton 4

如果不同类型的名称有两个最大值怎么办:

print(df)

      name type   count
0   robert    x     123
1   robert    y     456
2   robert    z    5123
3   robert    a    5123
4  charlie    x  442123
5  charlie    y       0
6  charlie    z      42
Run Code Online (Sandbox Code Playgroud)

使用布尔索引:

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

输出:

      name type   count
2   robert    z    5123
3   robert    a    5123
4  charlie    x  442123
Run Code Online (Sandbox Code Playgroud)