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

时间:2018-12-18 22:52:17

标签: python pandas

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

name         type     count
robert       x        123
robert       y        456
robert       z        5123
charlie      x        442123
charlie      y        0 
charlie      z        42

我试图找出每种名称中具有最高计数的类型,因此在这种情况下,我想选择以下类型:

name         type    count
robert       z       5123
charlie      x       442123

我知道我可以这样做以获取每个名称的最大数量,但是我不确定如何添加“类型”列,这实际上是最重要的

df.sort_values('count', ascending=False).drop_duplicates('name').sort_index()

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

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

df.sort_values(['name', 'count'],ascending=False).groupby(['name']).first().reset_index()

会给您:

    name type   count
3  charlie    x  442123
2   robert    z    5123

答案 1 :(得分:0)

尝试一下

df.loc[df.groupby('name')['count'].idxmax()]['type']

      name type   count
3  charlie    x  442123
2   robert    z    5123

如果您不仅希望获得一个最大值,而且还希望每个组都可以提供最高的n值(例如n = 2

df.loc[df.groupby('name')['count'].nlargest(2).index.get_level_values(1)]

      name type   count
3  charlie    x  442123
5  charlie    z      42
2   robert    z    5123
1   robert    y     456

答案 2 :(得分:0)

如果一个名称具有两个不同类型的最大值,该怎么办?

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

使用布尔索引:

df[df['count'] == df.groupby('name')['count'].transform('max')]

输出:

      name type   count
2   robert    z    5123
3   robert    a    5123
4  charlie    x  442123