Python pandas与OR逻辑合并

时间:2017-05-11 21:10:45

标签: python pandas dataframe merge

我正在搜索并且找不到这个问题的答案,您是否可以使用OR逻辑执行pandas数据帧的合并?基本上,使用"相当于SQL合并,其中t1.A = t2.A OR t1.A = t2.B"。

我有一种情况,我将信息从一个数据库拉到数据框(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'))

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')

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

2 个答案:

答案 0 :(得分:1)

我想我会在两次合并时这样做:

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

答案 1 :(得分: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')]