我想知道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实现相同的联接表。任何人都可以分享见解?
谢谢!
答案 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]
的区别。