所以我有两个数据帧,每个数据帧由6列组成,每列包含数字。我需要比较每个数据帧中的1列,以确保它们匹配并修复该列中不匹配的任何值。列已经排序,并且它们在长度方面匹配。到目前为止,我可以在列中找到差异:
df1.loc[(df1['col1'] != df2['col2'])]
然后我得到了df1
与df2
不匹配的索引#。然后我将转到df2
中的相同索引#,找出col2中的哪个值导致不匹配,然后使用此值将值更改为df2
中找到的正确值:
df1.loc[index_number, 'col1'] = new_value
有没有办法可以自动修复不匹配,而无需手动查找df2
中的正确值?
答案 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]