python找最大值位置 - 找出list中最大值




在Python列中查找最大值 (3)

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

我有一個數據框架( 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 (沒有任何改變)。

我究竟做錯了什麼?


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

您可以創建一個布爾值索引來檢查給定IdRank是否等於它的最大值。 然後使用布爾索引從數據框中提取最大值。

transform的幫助下,使用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




pandas-groupby