pandasデータフレームの値をグループ化し、各グループから最新の(日付順)を選択する方法は?
たとえば、日付でソートされたデータフレームがある場合:
id product date
0 220 6647 2014-09-01
1 220 6647 2014-09-03
2 220 6647 2014-10-16
3 826 3380 2014-11-11
4 826 3380 2014-12-09
5 826 3380 2015-05-19
6 901 4555 2014-09-01
7 901 4555 2014-10-05
8 901 4555 2014-11-01
iDまたは製品でグループ化し、最も早いものを選択すると:
id product date
2 220 6647 2014-10-16
5 826 3380 2015-05-19
8 901 4555 2014-11-01
idxmax
でgroupby
を使用し、df
でloc
をスライスします
df.loc[df.groupby('id').date.idxmax()]
id product date
2 220 6647 2014-10-16
5 826 3380 2015-05-19
8 901 4555 2014-11-01
Groupbyでtail
を使用して、グループの最後のn個の値を取得することもできます。
df.sort_values('date').groupby('id').tail(1)
id product date
2 220 6647 2014-10-16
8 901 4555 2014-11-01
5 826 3380 2015-05-19
日付でソートされたデータフレームが与えられると、いくつかの方法で要求を取得できます。
このような:
_df.groupby(['id','product']).last()
_
このような:
_df.groupby(['id','product']).nth(-1)
_
またはこのように:
_df.groupby(['id','product']).max()
_
id
とproduct
をインデックスとして表示したくない場合は、groupby(['id', 'product'], as_index=False)
を使用します。または、次を使用します。
_df.groupby(['id','product']).tail(1)
_
.tail()
を集約メソッドとして使用し、グループ化を維持するには:
df.sort_values('date').groupby('id').apply(lambda x: x.tail(1))
id product date
id
220 2 220 6647 2014-10-16
826 5 826 3380 2015-05-19
901 8 901 4555 2014-11-01
同様の問題が発生し、drop_duplicates
ではなくgroupby
。
上記で提案した他の方法と比較すると、大規模なデータセットで大幅に高速に実行されるようです。
df.sort_values(by="date").drop_duplicates(subset=["id"], keep="last")
id product date
2 220 6647 2014-10-16
8 901 4555 2014-11-01
5 826 3380 2015-05-19