【发布时间】:2021-09-04 14:04:24
【问题描述】:
我在单元格中有 2 个带有字符串的数据框:
df1
ID t1 t2 t3
0 x1 y1 z1
1 x2 y2 z2
2 x3 y3 z3
3 x4 y4 z4
4 x1 y5 z5
df2
ID t1 t2 t3
0 x3 y3 z3
1 x4 y4 z4
2 x1 y1 z1
3 x2 y2 z2
4 x1 y7 z5
我发现我可以将行中的差异与:
#exactly the same t1, t2, and t3
pd.merge(df1, df2, on=['t1', 't2', 't3'], how='inner')
这将找到行之间的精确匹配(其中 df1 中的 t1 等于 df2 中的 t1,等等)。
如何找到特定列的 2 个数据框之间的半匹配?也就是说,除了完全匹配之外,只有指定的列可能存在差异?例如,如果我指定t2,则匹配将是t1 in df1 = t1 in df2、t2 in df1 != df2、t3 in df1 = t3 in df3(例如,除了完全匹配之外,2 个数据帧中的行ID=4 将匹配此)。
更新 1:
似乎很多答案都考虑了顺序(如果行不完全对齐,该方法将失败)。
尝试以下方法来检查您的方法:
d1 = {'Entity1': ['x1', 'x2','x3','x4','x1', 'x6', 'x1'], 'Relationship': ['y1', 'y2','y3','y4','y5','y6', 'y9'], 'Entity2': ['z1', 'z2','z3','z4','z5','z6', 'z5']}
df1 = pd.DataFrame(data=d1)
d2 = {'Entity1': ['x3', 'x4','x1','x2','x6','x1'], 'Relationship': ['y3', 'y4','y1','y2','y6','y7'], 'Entity2': ['z3', 'z4','z1','z2','z7','z5']}
df2 = pd.DataFrame(data=d2)
请注意,精确匹配之一是x2, y2, z2,半匹配之一是df1 = x1, y5, z5、df2 = x1, y7,z5
【问题讨论】:
-
您正在寻找以下内容吗?
df3 = pd.merge(df1, df2, on=['t1', 't2', 't3'], how='outer');df3[df3.isna().any(axis=1)]结果是逐行提取不匹配的行。 -
您只想合并
t1和t3吗?pd.merge(df1, df2, on=['t1', 't3'], how='inner')