在熊猫数据框的重复行中删除或替换值

时间:2019-05-06 23:22:45

标签: python pandas dataframe duplicates

我有一个数据框df,其中某些行相对于列的子集是重复的:

A    B     C
1    Blue  Green
2    Red   Green
3    Red   Green
4    Blue  Orange
5    Blue  Orange

我想针对BC删除(或替换为虚拟字符串)重复行的值,而不删除整个行,理想情况下产生:

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替换了每一行-显然我在做错什么。我将不胜感激如何进行操作的任何建议!

3 个答案:

答案 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']})

导致

enter image description here

步骤1:确定重复项:

为此,我只是添加了另一个(促进者)列,并使用True / False询问B和C是否重复。

df['IS_DUPLICATED']= df.duplicated(subset=['B','C'])

enter image description here

第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

enter image description here

步骤4:删除IS_DUPLICATED列:

df.drop('IS_DUPLICATED',axis=1, inplace=True)

和所需的结果:

enter image description here

答案 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