比较pandas中的两列以使它们匹配

时间:2016-12-21 15:13:24

标签: python pandas

所以我有两个数据帧,每个数据帧由6列组成,每列包含数字。我需要比较每个数据帧中的1列,以确保它们匹配并修复该列中不匹配的任何值。列已经排序,并且它们在长度方面匹配。到目前为止,我可以在列中找到差异:

df1.loc[(df1['col1'] != df2['col2'])]

然后我得到了df1df2不匹配的索引#。然后我将转到df2中的相同索引#,找出col2中的哪个值导致不匹配,然后使用此值将值更改为df2中找到的正确值:

df1.loc[index_number, 'col1'] = new_value

有没有办法可以自动修复不匹配,而无需手动查找df2中的正确值?

2 个答案:

答案 0 :(得分:1)

我认为您需要按eq进行比较,然后如果需要添加值不匹配使用combine_first

df1 = pd.DataFrame({'A':[1,2,3],
                   'B':[4,5,6],
                   'C':[7,8,9],
                   'D':[1,6,5],
                   'E':[5,3,6],
                   'F':[1,4,3]})

print (df1)
   A  B  C  D  E  F
0  1  4  7  1  5  1
1  2  5  8  6  3  4
2  3  6  9  5  6  3

df2 = pd.DataFrame({'A':[1,2,1],
                   'B':[4,5,6],
                   'C':[7,8,9],
                   'D':[1,3,5],
                   'E':[5,3,6],
                   'F':[7,4,3]})

print (df2)
   A  B  C  D  E  F
0  1  4  7  1  5  7
1  2  5  8  3  3  4
2  1  6  9  5  6  3

如果需要将一列与所有DataFrame进行比较:

print (df1.eq(df2.A, axis=0))
       A      B      C      D      E      F
0   True  False  False   True  False   True
1   True  False  False  False  False  False
2  False  False  False  False  False  False
print (df1.eq(df1.A, axis=0))
      A      B      C      D      E      F
0  True  False  False   True  False   True
1  True  False  False  False  False  False
2  True  False  False  False  False   True

如果需要相同的列D

df1.D = df1.loc[df1.D.eq(df2.D), 'D'].combine_first(df2.D)
print (df1)

   A  B  C    D  E  F
0  1  4  7  1.0  5  1
1  2  5  8  3.0  3  4
2  3  6  9  5.0  6  3

但更容易的是只将D的{​​{1}}列分配到df2的{​​{1}}:

D

如果索引不同,可以使用values将列转换为df1

df1.D = df2.D
print (df1)
   A  B  C  D  E  F
0  1  4  7  1  5  1
1  2  5  8  3  3  4
2  3  6  9  5  6  3

答案 1 :(得分:1)

如果df2是权威来源,则您无需检查df1相等的位置

df1.loc[:, 'column_name'] = df2['column_name']

但是如果我们必须检查

c = 'column_name'
df1.loc[df1[c] != df2[c], c] = df2[c]