在Python列中查找最大值

5
我在Pandas Python中有一个数据框(combined_ranking_df),长这样:

                Id  Rank                         Activity
0              14035   8.0                         deployed
1              47728   8.0                         deployed
2              24259   1.0                         NaN
3              24259   6.0                         WIP
4              14251   8.0                         deployed
5              14250   1.0                         NaN
6              14250   6.0                         WIP
7              14250   5.0                         NaN
8              14250   5.0                         NaN
9              14250   1.0                         NaN

我正试图获取每个id的最大值。例如,14250应该是6.0。24259应该是6.0。
                Id  Rank                         Activity
0              14035   8.0                         deployed
1              47728   8.0                         deployed
3              24259   6.0                         WIP
4              14251   8.0                         deployed
6              14250   6.0                         WIP

我尝试执行combined_ranking_df.groupby(['Id'], sort=False)['Rank'].max(),但我得到的结果是第一个dataframe(没有任何更改)。
我做错了什么?
4个回答

9

选项1
与@ayhan的答案在这里相同
这个答案通过对数据框进行排序来回答问题,每个'Id'组中留下最大值并放在最后一个位置。 pd.DataFrame.drop_duplicates使我们能够保留每个组的第一个或最后一个。 但是,这是一个非常快速的方便巧合。 它不能推广到每个'Id'的前两个。

df.sort_values('Rank').drop_duplicates('Id', 'last')

      Id  Rank  Activity
3  24259   6.0       WIP
6  14250   6.0       WIP
0  14035   8.0  deployed
1  47728   8.0  deployed
4  14251   8.0  deployed

您可以在结尾处对索引进行排序。
df.sort_values('Rank').drop_duplicates('Id', 'last').sort_index()

      Id  Rank  Activity
0  14035   8.0  deployed
1  47728   8.0  deployed
3  24259   6.0       WIP
4  14251   8.0  deployed
6  14250   6.0       WIP

方案2
groupbyidxmax
这是我认为解决这个问题最通俗易懂的方式。@MaxU的答案是一种适用于每个'Id'下最大的n的最佳方式。

df.loc[df.groupby('Id', sort=False).Rank.idxmax()]

      Id  Rank  Activity
0  14035   8.0  deployed
1  47728   8.0  deployed
3  24259   6.0       WIP
4  14251   8.0  deployed
6  14250   6.0       WIP

嗨,我尝试过这样做,但结果还是一样。我的列的数据类型有问题吗?我做了这个:groups = combined_ranking_df.loc[combined_ranking_df.groupby('Id', sort=False).Rank.idxmax()] - Adam
你告诉我!运行 combined_ranking_df.dtypes 并查看 'Rank' 是否为 float - piRSquared
如果不是,运行这个 combined_ranking_df.loc[combined_ranking_df.groupby('Id', sort=False).Rank.astype(float).idxmax()] - piRSquared

6

我理解为:

In [40]: df.groupby('Id', as_index=False, sort=False) \
           .apply(lambda x: x.nlargest(1, ['Rank'])) \
    ...:   .reset_index(level=1, drop=True)
Out[40]:
      Id  Rank  Activity
0  14035   8.0  deployed
1  47728   8.0  deployed
2  24259   6.0       WIP
3  14251   8.0  deployed
4  14250   6.0       WIP

或者是从@piRSquared那里更好的版本:

In [41]: df.groupby('Id', group_keys=False, sort=False) \
           .apply(pd.DataFrame.nlargest, n=1, columns='Rank')
Out[41]:
      Id  Rank  Activity
0  14035   8.0  deployed
1  47728   8.0  deployed
3  24259   6.0       WIP
4  14251   8.0  deployed
6  14250   6.0       WIP

df.groupby('Id', group_keys=False, sort=False).apply(pd.DataFrame.nlargest, n=1, columns='Rank') - piRSquared
@piRSquared,我完全忘记了group_keys参数 - 非常感谢! - MaxU - stand with Ukraine
1
我支持你! - piRSquared

4

尝试将其存储,然后查看已存储的groupedby

groups = combined_ranking_df.groupby(['Id'], as_index=False, sort=False).max()[['Id','Rank']].

      Id  Rank
0  14035   8.0
1  47728   8.0
2  24259   6.0
3  14251   8.0
4  14250   6.0

1
使用 sort=False 参数以获得 OP 的输出结果。 - cs95

3
你可以创建一个布尔索引来检查给定IdRank是否等于其最大值。然后使用布尔索引从数据框中提取最大值。
掩码是使用对Id进行groupby并借助transform创建的,它保留了数据框的原始尺寸。
>>> df[(df[['Rank']] == df[['Id', 'Rank']].groupby('Id').transform(max)).squeeze().tolist()]
      Id  Rank  Activity
0  14035     8  deployed
1  47728     8  deployed
3  24259     6       WIP
4  14251     8  deployed
6  14250     6       WIP

我从你的回答中学到了很多东西... 我希望能更经常地看到它们 (-: - piRSquared
非常有趣和不同寻常的方法 - 我真的很喜欢它! - MaxU - stand with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接