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,如果你想在一行中完成,你可以像这样链接query
:df1.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的主要内容,如果未能解决你的问题,请参考以下文章