Skip to main content
 首页 » 编程设计

python之如何根据特定条件过滤重复行

2025年05月04日14emanlee

我有一个看起来像这样的数据框,但行数更多:

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 

请您参考如下方法:

您可以计算两个条件:

  1. 一个使用groupby、transform 和nunique,以及
  2. 其他与状态有关

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