鉴于以下数据:
data_df = pd.DataFrame({
"Reference": ("A", "A", "A", "B", "C", "C", "D", "E"),
"Value1": ("U", "U", "U--","V", "W", "W--", "X", "Y"),
"Value2": ("u", "u--", "u","v", "w", "w", "x", "y")
}, index=[1, 2, 3, 4, 5, 6, 7, 8])
truth_df = pd.DataFrame({
"Reference": ("A", "B", "C", "D", "E"),
"Value1": ("U", "V", "W", "X", "Y"),
"Value2": ("u", "v", "w", "x", "y")
}, index=[1, 4, 5, 7, 8])
data_df 引用
值1
值2
1
一种
你
你
2
一种
你
你——
3
一种
你——
你
4
乙
伏
v
5
C
宽
瓦
6
C
W--
瓦
7
D
X
X
8
乙
是
是
真相_df
引用
值1
值2
1
一种
你
你
4
乙
伏
v
5
C
宽
瓦
7
D
X
X
8
乙
是
是
下面的代码将两者合并并标记值不匹配的行
truth_df
df_out = data_df.merge(truth_df, on=['Reference', 'Value1','Value2'], how='left', indicator=True).rename(columns={"_merge":"Issues"})
df_out["Issues"] = np.where(df_out["Issues"] == "left_only", "Flag", "")
df_out
产生以下数据框df_out
引用
值1
值2
问题
0
一种
你
你
1
一种
你
你——
旗帜
2
一种
你——
你
旗帜
3
乙
伏
v
4
C
宽
瓦
5
C
W--
瓦
旗帜
6
D
X
X
7
乙
是
是
我想知道是否有办法确定哪些列发生冲突,而不是显示
Flag
我将显示列名,如 Value1
和 Value2
分别。所需的 df
引用
值1
值2
问题
0
一种
你
你
1
一种
你
你——
值2
2
一种
你——
你
值1
3
乙
伏
v
4
C
宽
瓦
5
C
W--
瓦
值1
6
D
X
X
7
乙
是
是
请注意 即使
Reference
列看起来很有用,但在我的真实数据中它不是可靠的来源,因此任何解决方案都不得使用该列。
最佳答案
您可以使用 df.set_index
将两个数据帧的索引设置为索引然后使用 df.ne
检查相等性然后使用 df.dot
与列。
data_df = data_df.set_index('Reference') # Ignore if Reference is index already
truth_df = truth_df.set_index('Reference') # Ignore if Reference is index already
data_df['issue'] = data_df.ne(truth_df, axis=1).dot(data_df.columns)
print(data_df.reset_index())
Reference Value1 Value2 issue
0 A U u
1 A U u-- Value2
2 A U-- u Value1
3 B V v
4 C W w
5 C W-- w Value1
6 D X x
7 E Y y
关于python - 如何获取 Pandas df.merge() 不匹配的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67457473/