Python pandas 与 OR 逻辑合并

2024-01-09

我正在搜索,但没有找到这个问题的答案,你可以使用 OR 逻辑执行 pandas 数据帧的合并吗?基本上,相当于使用“where t1.A = t2.A OR t1.A = t2.B”的 SQL 合并。

我遇到一种情况,我将信息从一个数据库提取到数据帧(df1)中,并且需要将其与另一个数据库中的信息合并,然后将其提取到另一个数据帧(df2)中,并基于单列(col1)进行合并。如果它们在匹配时始终使用相同的值,那就非常简单了。我遇到的情况是有时它们匹配,有时它们使用同义词。第三个数据库有一个表,该表提供该数据实体(col1 和 col1_alias)的同义词之间的查找,可以将其拉入第三个数据帧(df3)。我想要做的是合并 df1 中我需要的列和 df2 中我需要的列。

如上所述,在 df1.col1 和 df2.col1 匹配的情况下,这将起作用......

df = df1.merge(df2, on='col1', how='left')

然而,它们并不总是具有相同的值,有时具有同义词。我考虑过根据 df3.col1 位于 df1.col1 中或 df3.col1_alias 位于 df1.col1 中的时间来创建 df3。然后,从 df3.col1 和 df3.col1_alias (list1) 创建单个值列表,并根据 list1 中的 df2.col1 选择 df2。这将为我提供所需的 df2 行,但是,这仍然无法让我合并 df1 和 df2 匹配适当的行。我认为如果有一个 OR 合并选项,我可以逐步执行此操作并使其工作,但以下所有操作都会引发语法错误:

df = df1.merge((df3, left_on='col1', right_on='col1', how='left')|(df3, left_on='col1', right_on='col1_alias', how='left'))

and

df = df1.merge(df3, (left_on='col1', right_on='col1')|(left_on='col1', right_on='col1_alias'), how='left')

and

df = df1.merge(df3, left_on='col1', right_on='col1'|right_on='col1_alias', how='left')

以及其他几种变体。有关如何执行 OR 合并的任何指导,或关于使用 df3 中两列中的同义词合并 df1 和 df2 的完全不同方法的建议?


我想我会将其作为两次合并来完成:

In [11]: df = pd.DataFrame([[1, 2], [3, 4], [5, 6]], columns=["A", "B"])

In [12]: df2 = pd.DataFrame([[1, 7], [2, 8], [4, 9]], columns=["C", "D"])

In [13]: res = df.merge(df2, left_on="B", right_on="C", how="left")

In [14]: res.update(df.merge(df2, left_on="A", right_on="C", how="left"))

In [15]: res
Out[15]:
   A  B    C    D
0  1  2  1.0  7.0
1  3  4  4.0  9.0
2  5  6  NaN  NaN

正如您所看到的,这选择了 A = 1 -> D = 7,而不是 B = 2 -> D = 8。

注意:为了获得更多的可扩展性(匹配不同的列),拉出单个列可能是有意义的,尽管它们在本例中是相同的:

In [21]: res = df.merge(df2, left_on="B", right_on="C", how="left")["C"]

In [22]: res.update(df.merge(df2, left_on="A", right_on="C", how="left")["C"])

In [23]: res
Out[23]:
0    1.0
1    4.0
2    NaN
Name: C, dtype: float64
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python pandas 与 OR 逻辑合并 的相关文章

随机推荐