如何使用pandasql对pandasDataFrames执行复杂的条件外部联接



这是一个我花了很长时间才解决的问题,我想分享我的解决方案。问题来了。

我们有两个熊猫数据帧,需要在非常复杂的条件下进行外部连接。这是我的:

condition_statement = """
ON (
A.var0 = B.var0
OR (
A.var1 = B.var1
AND (
A.var2 = B.var2
OR A.var3 = B.var3
OR A.var4 = B.var4
OR A.var5 = B.var5
OR A.var6 = B.var6
OR A.var7 = B.var7
OR (
A.var8 = B.var8
AND A.var9 = B.var9
)
)
)
)
"""

在熊猫身上这样做简直是噩梦。

我喜欢用pandasql包进行大部分DataFrame按摩。它允许您在本地环境中的DataFrames之上运行SQL查询。

pandasql的问题是它在SQLite引擎上运行,所以不能执行RIGHT或FULL OUTER联接。

那么你是如何处理这个问题的呢?

您可以使用两个LEFT联接、一个条件和一个UNION来实现FULL OUTER联接。

首先,声明一个包含要检索的列的代码段:

select_statement = """
SELECT 
A.var0
, B.var1
, COALESCE(A.var2, B.var2) as var2
"""

接下来,构建一个条件,表示a中的所有值为NULL。我使用DataFrame:中的列构建了我的

where_a_is_null_statement = f"""
WHERE 
{" AND ".join(["A." + col + " is NULL" for col in A.columns])}
"""

现在,使用所有这些片段执行2-LEFT-JOIN-with-a-UNION技巧:

sqldf(f"""
{select_statement}
FROM A
LEFT JOIN B
{condition_statement}
UNION
{select_statement}
FROM B
LEFT JOIN A
{condition_statement}
{where_a_is_null_statement}
""")

最新更新