web-dev-qa-db-ja.com

Pandas)でgroupbyの後の最大日付に関連付けられた行を見つけます

次のように、PERSON_ID、MOVING_DATE、およびPLACEを含む3つの列を持つpandas DataFrameがあります。

df = pandas.DataFrame(
[[1,datetime.datetime(2018, 1, 1), 'New York'], 
 [1, datetime.datetime(2018, 1, 20), 'Rio de Janeiro'],
 [1, datetime.datetime(2018, 2, 13), 'London'],
 [2, datetime.datetime(2017, 6, 12), 'Seatle'],
 [2, datetime.datetime(2016, 10, 10), 'New Mexico'],
 [3, datetime.datetime(2017, 9, 19), 'Sao Paulo'],
 [3, datetime.datetime(2015, 12, 11), 'Bangladesh']]],
columns=['PERSON ID', 'MOVING DATE', 'PLACE']
)

   PERSON ID MOVING DATE           PLACE
0          1  2018-01-01        New York
1          1  2018-01-20  Rio de Janeiro
2          1  2018-02-13          London
3          2  2017-06-12          Seatle
4          2  2016-10-10      New Mexico
5          3  2017-09-19       Sao Paulo
6          3  2015-12-11      Bangladesh

最後の移動日(MOVEMENT_DATE)に基づいて、その人がいる場所を見つけたいと思います。

groupbyメソッドで結果を取得することは可能ですか?

これまでのところ、私は試しました:

df = df.sort_values(['PERSON ID', 'MOVING DATE'])
df.groupby(['PERSON ID', 'MOVING DATE']).agg(
     {'MOVING DATE': max, 'PLACE': 'last'}
)

しかし、それはうまくいきませんでした。どんな助けでもいただければ幸いです。

前もって感謝します、

レナン

6
Rhenan Bartels

DataFrame.groupbyGrouper.lastを使用したワンライナー:

df.sort_values('MOVING DATE').groupby('PERSON ID').last()

出力:

     MOVING DATE      PLACE
PERSON ID                       
1          2018-02-13     London
2          2017-06-12     Seatle
3          2017-09-19  Sao Paulo
9
Yuca

sortはここではやり過ぎです。locidxmaxでこれを実行できる場合、それはO(nlogn)時間計算量です。

df.loc[df.groupby('PERSON ID')['MOVING DATE'].idxmax()]
   PERSON ID MOVING DATE      PLACE
2          1  2018-02-13     London
3          2  2017-06-12     Seatle
5          3  2017-09-19  Sao Paulo
4
user3483203

@Yucaと提供された回答に追加するには、.last()が追加されたのと同じ方法で、pandas lib内に提供された.max()関数を利用することもできます。

詳細: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.max.html

1
Tyler Filko