pandas - 別の列によってインデックス付けされた特定の列の最新の値を取得する(別の列によってインデックス付けされた特定の列の最大値を取得する)質問する

pandas - 別の列によってインデックス付けされた特定の列の最新の値を取得する(別の列によってインデックス付けされた特定の列の最大値を取得する)質問する

次のデータフレームがあります:

   obj_id   data_date   value
0  4        2011-11-01  59500    
1  2        2011-10-01  35200 
2  4        2010-07-31  24860   
3  1        2009-07-28  15860
4  2        2008-10-15  200200

このデータのサブセットを取得して、各 の最新 (最大'data_date')のみを取得したいと考えています。'value''obj_id'

解決策をまとめましたが、汚い感じがします。もっと良い方法がある人はいないかと思っています。パンダを使って簡単に実行できる方法を見逃しているに違いありません。

私の方法は基本的に、次のようにグループ化、並べ替え、取得、再結合することです。

row_arr = []
for grp, grp_df in df.groupby('obj_id'):
    row_arr.append(dfg.sort('data_date', ascending = False)[:1].values[0])

df_new = DataFrame(row_arr, columns = ('obj_id', 'data_date', 'value'))

ベストアンサー1

「obj_id」の数が非常に多い場合は、データフレーム全体を並べ替えてから重複を削除して最後の要素を取得する必要があります。

sorted = df.sort_index(by='data_date')
result = sorted.drop_duplicates('obj_id', keep='last').values

これは、キーの数が多い場合に遅くなるカスタム agg 関数を実行する必要がないため、より高速になるはずです (申し訳ありませんが、テストしていません)。データフレーム全体を並べ替える方が悪いと思われるかもしれませんが、実際には、Python では並べ替えは高速で、ネイティブ ループは低速です。

おすすめ記事