【问题标题】:Finding the max value in Python Column在 Python Column 中查找最大值
【发布时间】:2017-12-17 06:17:51
【问题描述】:

我在 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(没有任何改变)。

我做错了什么?

【问题讨论】:

    标签: python pandas group-by pandas-groupby


    【解决方案1】:

    选项 1
    与@ayhan 的回答相同here
    这通过对将最大值留在每个'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 的答案是推广到最大 n'Id' 的最佳方式。

    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()]
    • 你告诉我!运行combined_ranking_df.dtypes 看看'Rank' 是不是float
    • 如果没有,请运行此代码 combined_ranking_df.loc[combined_ranking_df.groupby('Id', sort=False).Rank.astype(float).idxmax()]
    【解决方案2】:

    IIUC:

    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,我完全忘记了 group_keys 参数 - 非常感谢!
    • 我支持你!
    【解决方案3】:

    尝试存储它,然后查阅存储的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
    

    【讨论】:

    • sort=False 参数获取OP的输出
    【解决方案4】:

    您可以创建一个布尔索引来检查给定IdRank 是否等于其最大值。然后使用布尔索引从数据框中提取最大值。

    transform 的帮助下,使用Id 上的groupby 创建掩码,它保留了数据框的原始尺寸。

    >>> 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
    

    【讨论】:

    • 我从你的回答中学到了很多...我希望我能经常看到它们(-:
    • 非常有趣和不同寻常的方法——我真的很喜欢它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2013-10-05
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多