【问题标题】:Python merge equivalent to SQL join with like operatorPython 合并等价于使用 like 运算符的 SQL 连接
【发布时间】:2019-02-06 06:57:51
【问题描述】:

我有一个包含名称的 Pandas DataFrame1。

column1:    column2:
John        some_value
Steve       some_value
Mark        some_value

另一个包含全名的 DataFrame2。

column1:        column2:
John Smith      some_value
Steve James     some_value
Mark Taylor     some_value

我需要做一个相当于SQL的marge:

select
     df1.column1
    ,df2.column2
from DataFrame1 df1
join DataFrame2 df2
  on df1.column1 like '%' + df2.column1 + '%'

任何帮助都会很好。

【问题讨论】:

    标签: python sql-server pandas merge sql-like


    【解决方案1】:
    import pandas as pd
    inputdataframe1 = [['John', 4],['Steve', 5],['Mark', 6]]
    inputdataframe2= [['John smith', 9],['Steve James', 8],['Mark Taylor', 4]]
    dataframe1 = pd.DataFrame(inputdataframe1)
    dataframe2= pd.DataFrame(inputdataframe2)
    merged_dataframe = pd.merge(dataframe1, dataframe2, left_on=[0],right_on=[0],how='outer')
    

    输出会是这样,因为我们不能直接合并它

            0   1_x     1_y
    0   John    4.0     NaN
    1   Steve   5.0     NaN
    2   Mark    6.0     NaN
    3   John smith  NaN 9.0
    4   Steve James NaN 8.0
    5   Mark Taylor NaN 4.0
    

    如果您需要加入两个数据框,请使用 like 下面的代码将帮助您

    import pandas as pd
    inputdataframe1 = [['John', 4],['Steve', 5],['Mark', 6]]
    inputdataframe2= [['John smith', 9],['Steve James', 8],['Mark Taylor', 4]]
    dataframe1 = pd.DataFrame(inputdataframe1)
    dataframe2= pd.DataFrame(inputdataframe2)
    dataframe1_names=[key for key,value in inputdataframe1]
    dataframe2_names=[key for key,value in inputdataframe2]
    d=dict(inputdataframe1)
    list_like_values=[[dataframe2_names[j],d[dataframe1_names[i]]] for i in range(len(dataframe2_names)) for j  in range(len(dataframe1_names)) if(dataframe1_names[i] in dataframe2_names[j])]
    dataframe1= pd.DataFrame(list_like_values)
    merged_dataframe = pd.merge(dataframe1, dataframe2, left_on=[0],right_on=[0],how='inner')
    

    输出格式如下

        0   1_x     1_y
    0   John smith  4   9
    1   Steve James 5   8
    2   Mark Taylor 6   4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多