Pandas 相当于 SQL 非 equi JOIN

Posted

技术标签:

【中文标题】Pandas 相当于 SQL 非 equi JOIN【英文标题】:Pandas equivalent of SQL non-equi JOIN 【发布时间】:2018-11-07 11:10:39 【问题描述】:

所以我有 2 个数据框想要合并在一起。

我正在合并 3 列,2 是一个简单的连接。

joined_df = pd.merge(df1, df2, how='left', on=['name', 'city'])

我希望它使用第三列,但这将是一个比较,如下所示:

joined_df = pd.merge(df1, df2, how='left',
on=['name', 'city', 'df1.year' >= 'df2.year_min'])

不确定这里的正确语法是什么。

如果是 SQL,我会很容易。

SELECT * FROM df1
JOIN df2 on (df1.name = df2.name and df1.year = df2.year and df1.year > df2.year_min)

有什么帮助吗?

【问题讨论】:

【参考方案1】:

Pandas merge 仅支持 equi-joins。您需要添加第二个过滤结果的步骤,如下所示:

joined_df = df1.merge(df2, how='left', on=['name', 'city'])
joined_df = joined_df[joined_df.year > joined_df.year_min]

【讨论】:

好的,我希望能够进行这种比较,但是将您的工作作为数据帧是不可能的。 @firestreak,如果你想在一行中完成,你可以像这样链接querydf1.merge(df2, on=['name', 'city']).query('year > year_min')。此外,how=left 会执行 left join,而不是您在 sql sn-p 中显示的 inner join 有谁知道这会如何影响内存占用?这似乎是稍后再次过滤的部分笛卡尔积。 @cheradenineZK 我不认为这是笛卡尔连接,因为已经存在的列上存在相等合并;这应该在到达非 equi 连接之前修剪数据框 @sammywemmy,当然你是对的,这不是完美的笛卡尔连接。但可悲的是,在实践中,对于每个连接键具有许多时间戳的大型事实表来说,这并没有太大的区别。它只是快速地破坏记忆。我用示例文件对其进行了测试,就我而言,这是不可行的。【参考方案2】:

你可以使用merge_asof,默认是向后合并

pd.merge_asof(df1,df2, left_on='year',right_on='joined_df', by=['name', 'city'])

【讨论】:

以上是关于Pandas 相当于 SQL 非 equi JOIN的主要内容,如果未能解决你的问题,请参考以下文章

相当于 pandas DataFrame 查询的 SQL

相当于 numpy 数组的 pandas read_sql_query?

使用 Joi,要求两个字段之一不为空

Pandas 条件聚合和非条件聚合在一起

从非修复标头开始的 csv 读取 pandas 数据帧

python pandas.merge() 函数 解析