2013-12-17 61 views
6

我有一個DF,我想通過CUSIP抓住最近一行。Groupby - 拍攝最後一個元素 - 我該如何保留nan's?

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行):

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] 

在0.13(rc現在出來),更快,更直接的方式將要使用cumcount

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

要確認,cumcount方法將需要重置一行之前的索引,正確嗎? 另外,是否需要pd.cumcount? – user1911092

+0

@ user1911092在0.13中有一個cumcount groupby方法,上面的代碼是複製並粘貼的。 (所以不,你不需要重置索引:)) –

+0

Huzzah for cumcount! –

相關問題