最大値 - python 配列




Pythonの列で最大値を見つける (3)

私はこのような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でした。

私は間違って何をしていますか?


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

オプション1
@ ayhanの答えはここと同じです
これは、 'Id'グループごとに最後の位置に最大値を残すデータフレームをソートすることによって質問に答えます。 pd.DataFrame.drop_duplicates使用すると、各グループの先頭または最後を保持できます。 しかし、これは非常に速い簡単な偶然の一致です。 'Id'上位2つを言うのは一般化していない。

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

ブールインデックスを作成して、特定のId Rankがその最大値と等しいかどうかを確認できます。 その後、ブーリアンインデックスを使用して、データフレームから最大値を抽出します。

マスクはId groupbyを使用してtransformの助けを借りて作成され、 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




pandas-groupby