【问题标题】:Pandas merge multiple columns with conditionsPandas 将多个列与条件合并
【发布时间】:2021-02-23 17:34:30
【问题描述】:

我必须执行多次合并,我正在寻找一种更好的方法,而不是每次都编写相同的代码,创建 4 个数据帧,将它们连接起来,然后再次将它们与原始数据合并。

我有 2 个数据框,它们都有 2 列包含数字。我想匹配这4列并输出匹配的数字。

这是一个例子:

df1 = pd.DataFrame({'Name':['John','Michael', 'Sam'], 'Tel1':['2222','3333', '1111'], 'Tel2':[np.nan, np.nan, '5555']})

df2 = pd.DataFrame({'Second Name':['Smith','Cohen','Moore','Kas', 'Faber'], 'Tel3':['888','3333',np.nan , np.nan, np.nan], 'Tel4':[np.nan, np.nan, np.nan , '1111', np.nan]})

预期输出:

我的代码:

df1_temp = pd.merge(df1,df2, left_on='Tel1', right_on='Tel3', how='left')
df2_temp = pd.merge(df1,df2, left_on='Tel1', right_on='Tel4', how='left')
df3_temp = pd.merge(df1,df2, left_on='Tel2', right_on='Tel3', how='left')
df4_temp = pd.merge(df1,df2, left_on='Tel2', right_on='Tel4', how='left')

concat = pd.concat(df1_temp...)

【问题讨论】:

    标签: python pandas dataframe loops merge


    【解决方案1】:

    这并没有缩短很多,但确实删除了一个步骤。

    concat = pd.concat([df1.merge(df2,left_on='Tel1', right_on='Tel3',how='left'), 
                        df1.merge(df2,left_on='Tel1', right_on='Tel4',how='left'),
                        df1.merge(df2,left_on='Tel2', right_on='Tel3',how='left'),
                        df1.merge(df2,left_on='Tel2', right_on='Tel4',how='left')])
    
    # Drop duplicates
    concat.drop_duplicates(inplace=True)
    
    
    
     Name   Tel1    Tel2    Second Name Tel3    Tel4
    0   John    2222    NaN             NaN  NaN    NaN
    1   Michael 3333    NaN           Cohen 3333    NaN
    2   Sam     1111    5555            NaN NaN     NaN
    1   Michael 3333    NaN             NaN NaN     NaN
    2   Sam     1111    5555            Kas NaN     1111
    0   John    2222    NaN           Moore NaN     NaN
    1   John    2222    NaN             Kas NaN     1111
    2   John    2222    NaN           Faber NaN     NaN
    3   Michael 3333    NaN           Moore NaN     NaN
    4   Michael 3333    NaN             Kas NaN     1111
    5   Michael 3333    NaN           Faber NaN     NaN
    0   John    2222    NaN           Smith 888     NaN
    1   John    2222    NaN           Cohen 3333    NaN
    4   Michael 3333    NaN           Smith 888     NaN
    

    【讨论】:

      【解决方案2】:

      你可以融合数据然后合并:

      df1['Second Name'] = (df1[['Tel1','Tel2']]
          .reset_index()
          .melt('index')
          .dropna()
          .merge(df2.melt('Second Name').dropna(),on='value')
          .set_index('index')['Second Name']
      )
      

      输出:

            Name  Tel1  Tel2 Second Name
      0     John  2222   NaN         NaN
      1  Michael  3333   NaN       Cohen
      2      Sam  1111  5555         Kas
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-25
        • 1970-01-01
        • 2016-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多