我有一个数据框架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替换了几乎每一行--所以很明显,我做错了什么。我希望你能给我任何关于如何进行的建议!
发布于 2019-05-06 23:35:15
df.loc[df.duplicated(subset=['B','C']), ['B','C']] = np.nan似乎为我工作。
编辑,包括@ALollz和@macaw_9227更正。
发布于 2019-05-07 00:20:07
让我和大家分享一下我最初是如何面对这些挑战的。显然,有更快的方法(一条直线),但为了解决这个问题,让我们在一个更直观的层次上这样做(稍后,您将看到您可以在一行中完成)。
所以我们开始..。
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:标识“True”IS_DUPLICATED:的索引
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)和预期的结果:

发布于 2019-05-07 00:32:13
我会用
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 NaNhttps://stackoverflow.com/questions/56013541
复制相似问题