我有一个数据框df
,其中某些行相对于列的子集是重复的:
A B C
1 Blue Green
2 Red Green
3 Red Green
4 Blue Orange
5 Blue Orange
我想针对B
和C
删除(或替换为虚拟字符串)重复行的值,而不删除整个行,理想情况下产生:
A B C
1 Blue Green
2 Red Green
3 NaN NaN
4 Blue Orange
5 Nan NaN
根据此线程:Replace duplicate values across columns in Pandas我尝试使用pd.Series.duplicated
,但是我无法使它与列子集中的重复项一起使用。
我也玩过:
is_duplicate = df.loc[df.duplicated(subset=['B','C'])]
df = df.where(is_duplicated==True, 999) # 999 intended as a placeholder that I could find-and-replace later on
但是,这几乎用每一列中的999
替换了每一行-显然我在做错什么。我将不胜感激如何进行操作的任何建议!
答案 0 :(得分:2)
df.loc[df.duplicated(subset=['B','C']), ['B','C']] = np.nan
似乎对我有用。
经过修改,包括@ALollz和@ macaw_9227更正。
答案 1 :(得分:1)
让我与您分享我一开始是如何面对这类挑战的。显然,有更快的方法(一种方法),但是为了得到答案,让我们在一个更直观的水平上进行操作(以后,您将看到可以在一行中完成操作)。
所以我们开始...
df = pd.DataFrame({"B":['Blue','Red','Red','Blue','Blue'],"C":['Green','Green','Green','Orange','Orange']})
导致
步骤1:确定重复项:
为此,我只是添加了另一个(促进者)列,并使用True / False询问B和C是否重复。
df['IS_DUPLICATED']= df.duplicated(subset=['B','C'])
第2步:确定IS_DUPLICATED'True'的索引:
dup_index = df[df['IS_DUPLICATED']==True].index
结果:Int64Index([2, 4], dtype='int64')
第3步:将其标记为Nan:
df.iloc[dup_index]=np.NaN
步骤4:删除IS_DUPLICATED列:
df.drop('IS_DUPLICATED',axis=1, inplace=True)
和所需的结果:
答案 2 :(得分:0)
我将使用
df[['B','C']]=df[['B','C']].mask(df.duplicated(['B','C']))
df
Out[141]:
A B C
0 1 Blue Green
1 2 Red Green
2 3 NaN NaN
3 4 Blue Orange
4 5 NaN NaN