我有一个面板数据,我想删除第一(几)行(S),其中包含NaN在每个组。(或者可以基于组内的索引和其他条件丢弃的一些通用方法。
df = pd.DataFrame(
{'ID': [10001, 10001, 10001, 10002, 10002, 10002, 10003, 10003, 10003, 10003],
'PRICE': [None, 11.5, 14.31, 15.125, 14.44, None, None, None, None, 23.55],
'date': [19920103, 19920106, 19920107, 19920108, 19920109, 19920110,
19920113, 19920114, 19920115, 19920116]},
index = range(1,11))
数据如下所示:
ID PRICE date
1 10001 NaN 19920103
2 10001 11.500 19920106
3 10001 14.310 19920107
4 10002 15.125 19920108
5 10002 14.440 19920109
6 10002 NaN 19920110
7 10003 NaN 19920113
8 10003 NaN 19920114
9 10003 NaN 19920115
10 10003 23.550 19920116
我想删除第1行和第7行,但不删除第9行,因为第9行不是最初几个缺失的观察之一,所以我尝试了
def mask_first_missing(x):
result = x.notnull() & x.rank()==1
return result
mask = df.groupby(['ID'])['PRICE'].transform(mask_first_missing).astype(bool)
print(df[mask])
但它删除了第1,7和9行,显然第9行不是第3组的第一个观察结果,
如果我这么做
df[df.groupby('ID', as_index=False)['PRICE'].nth(0).notnull()]
则groupby对象创建的索引与原始dataframe不对齐
有人能帮我吗?谢谢你
3条答案
按热度按时间js81xvg61#
这是一种方法:
3ks5zfa02#
使用自定义排名的替代方法:
说明:
zpqajqem3#
谢谢你的帮助,但我认为这两个答案都不适合我的任务。
我自己想出了一个解决方案,通过创建一个子索引列。
然后就能得到
现在我可以根据列'subindex'选择每个组的第n个观察结果,而不是基于groupby执行所有操作。
现在,如果我想删除每个组的前两个NaN观察值,我可以创建一个掩码
结果是