【问题标题】:Python pandas merge with OR logicPython pandas 与 OR 逻辑合并
【发布时间】:2017-10-11 01:23:03
【问题描述】:

我正在搜索,但尚未找到此问题的答案,您能否使用 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'))

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 的完全不同方法的建议?

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案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
    

    【讨论】:

    • 非常感谢!一定会试一试的。
    【解决方案2】:
    #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 在这里是相当,因为如果两个合并列只匹配一行,则 IIUC。
    猜你喜欢
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多