2013-12-17 5 views
6

私はdfを持っており、私はCUSIPによって、最近の行をつかみたいです。Groupby - 最後の要素を取る - 私はどのようにナノを保つのですか?

In [374]: df.head() 
Out[374]: 
       CUSIP  COLA   COLB  COLC 
date               
1992-05-08 AAA   238   4256  3.523346 
1992-07-13 AAA   NaN   4677  3.485577 
1992-12-12 BBB   221   5150  3.24 
1995-12-12 BBB   254   5150  3.25 
1997-12-12 BBB   245   Nan  3.25 
1998-12-12 CCC   234   5140  3.24145 
1999-12-12 CCC   223   5120  3.65145 

私が使用しています:

df = df.reset_index().groupby('CUSIP').last().reset_index.set_index('date') 

を私はこの希望:

   CUSIP  COLA   COLB  COLC 
date   
1992-07-13 AAA   NaN   4677  3.485577  
1997-12-12 BBB   245   Nan  3.25 
1999-12-12 CCC   223   5120  3.65145 

代わりに私が取得しています:

   CUSIP  COLA   COLB  COLC 
date   
1992-07-13 AAA   238   4677  3.485577  
1997-12-12 BBB   245   5150  3.25 
1999-12-12 CCC   223   5120  3.65145 

は、どのように私は(最後入手できます)取ることをNaNを含むgroupbyの最後の行?

ありがとうございます。

答えて

4

あなたは、適用の代わりに、最後の(そして、各グループの-1th行を取得)と直接これを行うことができます:0.13で

In [11]: df.reset_index().groupby('CUSIP').apply(lambda x: x.iloc[-1]).reset_index(drop=True).set_index('date') 
Out[11]: 
      CUSIP COLA COLB  COLC 
date         
1992-07-13 AAA NaN 4677 3.485577 
1997-12-12 BBB 245 NaN 3.250000 
1999-12-12 CCC 223 5120 3.651450 

[3 rows x 4 columns] 

(今出RC)、より速く、より直接的な方法になります使用する:

In [12]: df[df.groupby('CUSIP').cumcount(ascending=False) == 0] 
Out[12]: 
      CUSIP COLA COLB  COLC 
date         
1992-07-13 AAA NaN 4677 3.485577 
1997-12-12 BBB 245 NaN 3.250000 
1999-12-12 CCC 223 5120 3.651450 

[3 rows x 4 columns] 
+0

確認するには、累積アプローチでは、前に行のインデックスをリセットする必要がありますか? また、pd.cumcountである必要がありますか? – user1911092

+0

@ user1911092 in 0.13 cumbount groupbyメソッドがあり、上記のコードはコピー&ペーストされています。 (だから、インデックスをリセットする必要はありません:)) –

+0

Huzzah for cumcount! –

関連する問題