根据不同的列联接两个表

时间:2020-08-05 13:53:32

标签: python

我在Pandas中有两个数据框DB1和DB2,都带有一个names列,其中包含公司名称。根据{{​​1}}列,我将模糊字符串匹配与string_grouper包一起用于为DB1和DB2中都存在的公司获取表matches,如下所示:

enter image description here

现在,我想将DB1和DB2加入names,即将其列附加到匹配项中,但仅适用于在匹配项中显示的公司。

因此,我想使用matches等同于DB1 ['names'](即,将matches['left_side']值等同于DB1的行附加到matches的每一行等于DB1['names'])和matches['left_side']中的值,等同于DB2中的DB2 ['names']。 (即,将matches['right_side']的值等同于matches中的值添加到DB2中的每一行,例如DB2['names']

我该怎么做?

我还认为可能需要重命名DB2 ['names'],因为否则生成的联接表将具有来自DB1 ['names']和DB2 ['names']的同名列?

编辑:很高兴在必要时使用SQL代替熊猫

1 个答案:

答案 0 :(得分:1)

import pandas as pd

df_db1 = ...
df_db2 = ...
df_matches = ...

# merge matches with db1 and specify the columns you want to use as key
df_matches = df_matches.reset_index().merge(df_db1, left_on=['left_side'], right_on=['names'], how="left", suffixes=["matches_", "db1_"]).set_index("index")
# merge matches (already matched with db1) again with db2 and specify the new columns you want to use as key
df_matches = df_matches.reset_index().merge(df_db2, left_on=['right_side'], right_on=['names'], how="left", suffixes=["matches_", "db2_"]).set_index("index")

reset_index() ... .set_index("index")部分将保留df_matches的初始索引,否则将被重置。

此外,您不必事先重命名列,因为您可以像这样使用suffixes参数:suffixes=["matches_", "db1_"],如果有2个同名列,则会自动重命名列。 / p>

还请记住,如果df_db1或df_db2的密钥都为duplicates,则在新的df_match中也将同时具有这两个密钥。如果您不希望这样做,则必须在此之前进行重复管理。

相关问题