首页 > 解决方案 > 动态连接取决于是否填写了列

问题描述

我有两个数据框,它们都包含我想要加入的相同列。但是 col3 是可选的,我想要实现的逻辑就是这样。如果所有列都已填写,则基于所有列连接,如果不是所有列都已填写,则连接 3 列。

填写所有列时的代码很简单,但我对如何实现动态连接条件感到困惑。

对于所有情况:

df1 = (
df1
.join(df2, on=['col1', 'col2', 'col3', 'col4'], how='left')
)

对于有条件的情况,我正在考虑利用合并,但这适用于表格的右侧,但不太确定左侧。

df1 = (
df1
.join(df2, on=(F.coalesce(df1.col1, df1.col2, df1.col3, df1.col4) == F.coalesce(df2.col1, df2.col2, df2.col3, df2.col4), how='left')
)

例如:df1 是

col1 col2 col3 col4 col8
 a.    b.   c.   d.   5
 e.    f.   g.   h.   3
 i.    j.   k.   l.   2

df2 是

col1 col2 col3 col4 col5    col23
a.    b.        d.   type1  there
e.    f.   g.   h.   type2   was
i.    j.   k.   l.   type3    a

此示例中的最终结果将是

col1 col2 col3 col4 col5
a.    b.        d.   type1
e.    f.   g.   h.   type2
i.    j.   k.   l.   type3

由于第一行缺少 col3 中的值,连接将使用 col1、col2 和 col4,但对于其余行,它将使用 col1、col2、col3 和 col4。

我有一种硬编码的方式来实现这一点,方法是在两边创建哈希键并使用合并,但想看看社区的建议。

我需要 df1 中的 col5 或连接的左侧,但需要根据填写的列数进行连接。这几乎就像从最确定的匹配(当所有列都被填写时)加入到最不确定的匹配(当 4 列中的 3 列都被填写时)。任何帮助表示赞赏

标签: dataframeapache-sparkpyspark

解决方案


推荐阅读