gpt4 book ai didi

Python pandas 与 OR 逻辑合并

转载 作者:太空宇宙 更新时间:2023-11-03 11:43:52 25 4
gpt4 key购买 nike

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

我有一种情况,我正在将一个数据库中的信息提取到一个数据框 (df1) 中,我需要将它与另一个数据库中的信息合并,我将其提取到另一个数据框 (df2) 中,基于单个列合并 (列 1)。如果这些在匹配时总是使用相同的值,那就非常简单了。我的情况是有时它们匹配,有时它们使用同义词。第三个数据库有一个表,该表提供此数据实体(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 的完全不同方法的建议?

最佳答案

我想我会把它作为两个合并来做:

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

关于Python pandas 与 OR 逻辑合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43925603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com