首页 > 解决方案 > 如何根据特定条件过滤重复行

问题描述

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

id         status       year
1           yes          2013
1           no           2013
1           yes          2014
3           no           2012
4           yes          2014
6           no           2014

我想过滤数据框,以便如果两行之间的 id 和 year 列相同,但状态列不同,则只保留状态为“是”的行。如果 id 和 year 组合的“no”没有与之关联的“yes”,我仍然想保留它。这导致我无法仅过滤状态列以仅具有“是”的行的问题。

这导致我无法仅过滤状态列以仅具有“是”的行的问题。

生成的数据框应如下所示,其中第一个数据框上的第二行将被取出,因为 ID 1 和 2013 年具有与之关联的“是”。但是 ID 为 3 和 6 的行仍然存在,因为这些 ID 和年份组合没有关联:

id         status       year
1           yes          2013
1           yes          2014
3           no           2012
4           yes          2014
6           no           2014

标签: pythonpandasfiltering

解决方案


您可以计算两个条件:

  1. 一个使用groupby,transformnunique, 和
  2. 另一个与状态有关的

或两个面具,并过滤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

推荐阅读