Pandas:如果左列与任何右列匹配,则合并

Den*_*gin 7 python pandas

如果左侧数据框中的一列与右侧数据框中的任何列相匹配,是否可以合并两个数据框:

SELECT
  t1.*, t2.*
FROM
  t1
JOIN
  t2 ON t1.c1 = t2.c1 OR 
        t1.c1 = t2.c2 OR 
        t1.c1 = t2.c3 OR 
        t1.c1 = t2.c4
Run Code Online (Sandbox Code Playgroud)

Python (类似):

import pandas as pd

dataA = [(1), (2)]

pdA = pd.DataFrame(dataA)
pdA.columns = ['col']

dataB = [(1, None), (None, 2), (1, 2)]

pdB = pd.DataFrame(dataB)
pdB.columns = ['col1', 'col2']

pdA.merge(pdB, left_on='col', right_on='col1') \
    .append(pdA.merge(pdB, left_on='col', right_on='col2'))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 在此输入图像描述 在此输入图像描述

piR*_*red 0

看起来我们正在逐行isin检查。我喜欢使用设置逻辑并使用 numpy 广播来提供帮助。

f = lambda x: set(x.dropna())
npB = pdB.apply(f, 1).values
npA = pdA.apply(f, 1).values

a = npA <= npB[:, None]
m, n = a.shape

rA = np.tile(np.arange(n), m)
rB = np.repeat(np.arange(m), n)

a_ = a.ravel()

pd.DataFrame(
    np.hstack([pdA.values[rA[a_]], pdB.values[rB[a_]]]),
    columns=pdA.columns.tolist() + pdB.columns.tolist()
)

   col  col1  col2
0  1.0   1.0   NaN
1  2.0   NaN   2.0
2  1.0   1.0   2.0
3  2.0   1.0   2.0
Run Code Online (Sandbox Code Playgroud)