Python中使用pandas进行OR逻辑合并

5

我正在搜索并没有找到这个问题的答案,您能否使用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,基于当df3.col1在df1.col1中或者df3.col1_alias在df1.col1中时。然后,从df3.col1和df3.col1_alias(list1)中创建一个值的单一列表,并基于list1选择df2.col1。这将给我所需的来自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'))

并且

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

并且

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

以及其他几种变化。如何执行OR合并的指导,或者对使用包含在df3中两列中的同义词完全不同的方法提出建议,以合并df1和df2?

2个回答

5

我认为这可以分为两个合并操作:

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

非常感谢!我一定会尝试的。 - stlouismv

0
#will this work?
df = pd.concat([df1.merge(df3, left_on='col1', right_on='col1', how='left'), df1.merge(df3, left_on='col1', right_on='col1_alias', how='left')]

我认为在这里使用concat不是很合适,因为如果两个合并列匹配,则只需要一行。 - Andy Hayden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接