基于Python中的多个复杂条件进行联接

时间:2019-04-14 15:08:53

标签: python sql pandas join merge

我想知道Python中(在Pandas之内或之外)是否有一种方法可以像在SQL中基于多个复杂条件对两个表进行等效连接,例如表1中的值小于10小于在表2中,或者仅在表1中满足某些条件的某个字段上,等等。

这是为了组合一些基本表以实现具有更多字段和信息的联合表。我知道在Pandas中,我们可以在某些列名称上合并两个数据框,但是这种机制似乎太简单了,无法提供所需的结果。

例如,等效的SQL代码可能像这样:

SELECT
a.*,
b.*
FROM Table1 AS a
JOIN Table 2 AS b
ON
a.id = b.id AND
a.sales - b.sales > 10 AND
a.country IN ('US', 'MX', 'GB', 'CA')

我想用一种等效的方法在两个数据帧上用Python实现相同的联接表。任何人都可以分享见解?

谢谢!

1 个答案:

答案 0 :(得分:1)

原则上,您的查询可以重写为.as-console-wrapper { max-height: 100% !important; top: 0; }和过滤器join子句。

where

假设数据帧很大,并且您不希望有大的中间表,那么我们可以首先过滤数据帧A。

SELECT a.*, b.*
FROM Table1 AS a
JOIN Table2 AS b
ON a.id = b.id 
WHERE a.sales - b.sales > 10 AND a.country IN ('US', 'MX', 'GB', 'CA')

题外话:根据使用情况,您可能需要使用import pandas as pd df_a, df_b = pd.Dataframe(...), pd.Dataframe(...) # since A.country has nothing to do with the join, we can filter it first. df_a = df_a[df_a["country"].isin(['US', 'MX', 'GB', 'CA'])] # join merged = pd.merge(df_a, df_b, on='id', how='inner') # filter merged = merged[merged["sales_x"] - merged["sales_y"] > 10] 的区别。