如何根据某些条件过滤重复行

时间:2018-12-19 18:00:23

标签: python pandas filtering

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

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

我想过滤数据框,以便如果两行之间的id和year列相同,但是status列不同,则仅保留状态为“是”的行。如果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

2 个答案:

答案 0 :(得分:6)

您可以计算两个条件:

  1. 使用groupbytransformnunique的人,以及
  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

答案 1 :(得分:1)

sort_values + drop_duplicates

这是使用Categorical Data的好机会。您可以按status排序,然后按idyear删除重复项:

df['status'] = pd.Categorical(df['status'], ordered=True, categories=['yes', 'no'])

res = df.sort_values('status').drop_duplicates(['id', 'year']).sort_index()

print(res)

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

根据您的用例,最终索引可能不需要排序。