web-dev-qa-db-ja.com

pandasデータフレームでグループ化し、各グループで最新を選択する

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

idxmaxgroupbyを使用し、dflocをスライスします

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

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

日付でソートされたデータフレームが与えられると、いくつかの方法で要求を取得できます。

このような:

_df.groupby(['id','product']).last()
_

このような:

_df.groupby(['id','product']).nth(-1)
_

またはこのように:

_df.groupby(['id','product']).max()
_

idproductをインデックスとして表示したくない場合は、groupby(['id', 'product'], as_index=False)を使用します。または、次を使用します。

_df.groupby(['id','product']).tail(1)
_
2
Sandu Ursu

.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
1
Kristin Q

同様の問題が発生し、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
1
Damien Marlier