stl*_*smv 5 python merge dataframe pandas
我正在搜索,但没有找到此问题的答案,可以使用OR逻辑执行熊猫数据帧的合并吗?基本上,等效于使用“其中t1.A = t2.A或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')
Run Code Online (Sandbox Code Playgroud)
但是,它们并不总是具有相同的值,有时还具有同义词。我考虑过基于df3.col1在df1.col1中或df3.col1_alias在df1.col1中的时间创建df3。然后,从df3.col1和df3.col1_alias(列表1)创建一个值列表,并基于列表1中的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'))
Run Code Online (Sandbox Code Playgroud)
和
df = df1.merge(df3, (left_on='col1', right_on='col1')|(left_on='col1', right_on='col1_alias'), how='left')
Run Code Online (Sandbox Code Playgroud)
和
df = df1.merge(df3, left_on='col1', right_on='col1'|right_on='col1_alias', how='left')
Run Code Online (Sandbox Code Playgroud)
和其他几种变体。关于如何执行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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这选择了 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
Run Code Online (Sandbox Code Playgroud)
#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')]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
772 次 |
| 最近记录: |