我有一个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的组的最后一行?
谢谢.
您可以直接使用 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)