我有一个看起来像这样的数据框,但是有更多的行:
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
答案 0 :(得分:6)
您可以计算两个条件:
groupby
,transform
和nunique
的人,以及两个遮罩或,然后在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
排序,然后按id
和year
删除重复项:
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
根据您的用例,最终索引可能不需要排序。