Groupby - 采取最后一个元素 - 我如何保持nan的?

use*_*092 6 python pandas

我有一个df,我想抓住CUSIP下面最近的一行.

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
Run Code Online (Sandbox Code Playgroud)

我在用:

df = df.reset_index().groupby('CUSIP').last().reset_index.set_index('date')
Run Code Online (Sandbox Code Playgroud)

我要这个:

              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
Run Code Online (Sandbox Code Playgroud)

相反,我得到:

              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
Run Code Online (Sandbox Code Playgroud)

如何让last()获取包括NaN的组的最后一行?

谢谢.

And*_*den 4

您可以直接使用 apply 而不是最后执行此操作(并获取每组的第 -1 行):

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]
Run Code Online (Sandbox Code Playgroud)

在 0.13 中(现已发布),更快、更直接的方法是使用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]
Run Code Online (Sandbox Code Playgroud)