22

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

   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'))
4

6 に答える 6

4

私はcrewbumの答えが好きです、おそらくこれはより速いです(申し訳ありませんが、これはまだテストしていませんが、私はすべてをソートすることを避けます):

df.groupby('obj_id').agg(lambda df: df.values[df['data_date'].values.argmax()])

numpysの「argmax」関数を使用して、最大値が表示されるrowindexを検索します。

于 2012-10-23T11:16:32.897 に答える
2

groupbyオブジェクトのaggregate()メソッドを使用すると、groupbyオブジェクトから新しいDataFrameを1つのステップで作成できます。(ただし、DataFrameの最初/最後の行を抽出するためのよりクリーンな方法はわかりません。)

In [12]: df.groupby('obj_id').agg(lambda df: df.sort('data_date')[-1:].values[0])
Out[12]: 
         data_date  value
obj_id                   
1       2009-07-28  15860
2       2011-10-01  35200
4       2011-11-01  59500

個々の列で集計を実行することもできます。その場合、集計関数はSeriesオブジェクトで機能します。

In [25]: df.groupby('obj_id')['value'].agg({'diff': lambda s: s.max() - s.min()})
Out[25]: 
          diff
obj_id        
1            0
2       165000
4        34640
于 2012-03-25T01:46:55.683 に答える
0

このスレッドの解決策に基づいて、より適切な解決策を見つけたと思います。ただし、私の場合は、集計の代わりにデータフレームの適用機能を使用します。また、元と同じ列を持つ新しいデータフレームも返します。

df = pd.DataFrame({
'CARD_NO': ['000', '001', '002', '002', '001', '111'],
'DATE': ['2006-12-31 20:11:39','2006-12-27 20:11:53','2006-12-28 20:12:11','2006-12-28 20:12:13','2008-12-27 20:11:53','2006-12-30 20:11:39']})

print df 
df.groupby('CARD_NO').apply(lambda df:df['DATE'].values[df['DATE'].values.argmax()])

オリジナル

CARD_NO                 DATE
0     000  2006-12-31 20:11:39
1     001  2006-12-27 20:11:53
2     002  2006-12-28 20:12:11
3     002  2006-12-28 20:12:13
4     001  2008-12-27 20:11:53
5     111  2006-12-30 20:11:39

返されたデータフレーム:

CARD_NO
000        2006-12-31 20:11:39
001        2008-12-27 20:11:53
002        2006-12-28 20:12:13
111        2006-12-30 20:11:39
于 2014-03-04T20:01:20.500 に答える