【问题标题】:Pandas equivalent of SQL non-equi JOINPandas 相当于 SQL 非 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)

有什么帮助吗?

【问题讨论】:

    标签: python pandas dataframe join merge


    【解决方案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'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 2016-11-29
      • 2017-05-25
      • 1970-01-01
      相关资源
      最近更新 更多