【问题标题】:Case Condition in Python with Pandas dataframe带有 Pandas 数据框的 Python 中的案例条件
【发布时间】:2021-05-03 07:45:56
【问题描述】:

这几天我一直在学习 pandas。我正在将 SQL DB 迁移到 PYTHON 并遇到了 sql 语句(示例):

select * from
table_A a
left join table_B b
on a.ide = b.ide
and a.credit_type = case when b.type > 0 then b.credit_type else a.credit_type end

我只能迁移到第一个条件。我的困难在最后一行,我不知道如何迁移它。表实际上是我存储在数据框中的 sql 查询。

merge = pd.merge(df_query_a, df_query_b),on='ide', how='left')

请有任何建议。

【问题讨论】:

    标签: python sql pandas dataframe


    【解决方案1】:

    Case 条件类似于 if-then-else 语句,您可以在 Pandas 中使用 np.where() 来实现,如下所示:

    基于左连接结果数据框merge

    import numpy as np
    
    merge['credit_type_x'] = np.where(merge['type_y'] > 0, merge['credit_type_y'], merge['credit_type_x'])
    

    这里的列名 credit_type_x credit_type_y 应该在重命名 2 个源数据帧上的冲突(相同)列名后在 Pandas 合并函数上创建。如果数据框 merge 没有列 type_y,因为列 type 仅出现在 Table_B 上而不出现在 Table_A 上,您可以在此处使用列名称 type

    或者,您只需要在type_y > 0 时修改credit_type_x 的值,如果不是type_y > 0,则保留credit_type_x 的值而不修改,我们也可以简单地这样做:

    merge.loc[merge['type_y'] > 0, 'credit_type_x'] = merge['credit_type_y']
    

    【讨论】:

    • 谢谢@SeaBean,我使用了第一个建议。当我想使用第二个时,我遇到了错误:试图在 DataFrame 中的切片副本上设置一个值。
    • @Tom 第二个建议的错误只是一个警告,你很可能仍然会得到你想要的结果,因为.loc 是在 Pandas 系列(一列)而不是整个 DataFrame .无论如何,为避免该警告,您可以根据我上面的最新编辑稍微更改语法。无论如何,这两个建议中的任何一个都应该适合您的情况。
    【解决方案2】:

    以下两个选项可以解决您的问题

    1. 您可以根据需要考虑两个数据框的条件在 df_query_a 中添加一列,然后进行合并。
    2. 您可以尝试使用pandasql3 的一些库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-21
      • 2023-03-13
      • 2016-02-12
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多