我有一个看起来像这样的数据框,但行数更多:
id status year
1 yes 2013
1 no 2013
1 yes 2014
3 no 2012
4 yes 2014
6 no 2014
我想过滤数据框,这样如果两行之间的 id 和 year 列相同,但状态列不同,则只保留状态为"is"的行。如果 id 和年份组合的“否”没有与之关联的"is",我仍然想保留它。这导致我无法仅过滤状态列以仅包含带有"is"的行。
这让我想到了无法仅过滤状态列以仅包含带有"is"的行的问题。
生成的数据框应如下所示,其中第一个数据框的第二行将被删除,因为 ID 1 和 2013 年有一个与之关联的"is"。但是,ID 为 3 和 6 的行仍然存在,因为没有与这些 ID 和年份组合关联的是:
id status year
1 yes 2013
1 yes 2014
3 no 2012
4 yes 2014
6 no 2014
请您参考如下方法:
您可以计算两个条件:
- 一个使用
groupby、transform和nunique,以及 - 其他与状态有关
OR 两个掩码,并在 df 上过滤:
m1 = df.groupby(['id','year']).status.transform('nunique').eq(1)
m2 = df.status.eq('yes')
df[m1 | m2]
id status year
0 1 yes 2013
2 1 yes 2014
3 3 no 2012
4 4 yes 2014
5 6 no 2014
