【问题标题】:SQL Alchemy using Or_ looping multiple columns (Pandas Dataframes)SQLAlchemy 使用 Orm 循环多列(Pandas Dataframes)
【发布时间】:2019-03-19 05:55:40
【问题描述】:

总结: 如何使用 OR_ 语句在 SQL Alchemy 中使用 table.column_name 组合查询来自不同数据框列的值。

我正在开发一个 SQL Alchemy 项目,在该项目中我拉下数据框的有效列并将它们全部输入到 SQL Alchemy 的过滤器中。我已经成功地让它运行,它会使用这样的列头输入列的所有条目:

qry = qry.filter(or_(*[getattr(Query_Tbl,column_head).like(x) \
      for x in (df[column_head].dropna().values)]))

这产生了我正在寻找的模式 (tbl.column1 like a OR tbl.column1 like b...) AND- 等等。

但是,有些数据帧组需要放在一起,列不同但仍需要放在 OR_ 类别中,

即(想要的结果)

(tbl1.col1 like a OR tbl.col1 like b OR tbl.col2 like c OR tbl.col2 like d OR tbl.col3 like e...) 等等。

我最近的尝试是将需要组合在一起的列分组,然后在这些组中重复以前的样式,例如:

qry = qry.filter(or_((*[getattr(Query_Tbl, set_id[0]).like(x) \
                 for x in (df[set_id[0]].dropna().values)]),
                 (*[getattr(Query_Tbl, set_id[1]).like(y) \
                 for y in (df[set_id[1]].dropna().values)]),
                 (*[getattr(Query_Tbl, set_id[2]).like(z) \
                 for z in (df[set_id[2]].dropna().values)])
                 ))

其中 set_id 是对应于 column1、column2 和 column 3 的 3 个字符串的列表,因此我得到了指定的结果,但是,这很简单:

(我实际上得到了什么)

(tbl.col1 像 a 或 tbl.col1 像 b..) AND (tbl.col2 像 c OR tbl.col2 像 d...) AND (tbl.col3 像 e OR...)

在 SQL Alchemy 中是否有更好的方法来解决这个问题以获得我想要的结果,或者最好找到一种方法将 Pandas 的列值直接实现到 getattr() 中以将其用于我现有的代码?

感谢您的阅读并提前为您提供帮助!

【问题讨论】:

    标签: python pandas dataframe sqlalchemy


    【解决方案1】:

    看来我对数据框的格式化方式有疑问,并且我正在以不同的方式将列名读入组中。此模式适用于任何想要将多个 df 列处理为相同 OR 语句的人。

    对于这个问题,我深表歉意,如果有人对此主题有任何问题或问题,我会帮助其他人解决此类问题。

    【讨论】:

      【解决方案2】:

      另外,我找到了一个更清晰的答案。由于 SQL Alchemy 的 OR_ 函数可以与变量列一起使用,如果您使用 Python 的内置 getattr() 函数,您只需要创建 (column,value) 对,您可以在循环中解压缩两者。

      for group in [group_2, group_3]:
          set_id = list(set(df.columns.values) & set(group))
          if len(set_id) > 1:
              set_tuple = list()
              for column in set_id:
                  for value in df[column].dropna().values:
                      set_tuple.append((column, value))
              print(set_tuple)
              qry = qry.filter(or_(*[getattr(Query_Tbl,id).like(x) for id, x in set_tuple]))
              df = df.drop(group, axis=1)
      

      如果您知道 Or_ 语句中需要对哪些列进行分组,则可以将它们放入列表中并遍历它们。在其中,您创建一个元组列表,您可以在其中创建所需的 (column, value) 对。然后在 Or_ 函数中循环更新列和值,并相应地分配它们。代码必须更易于阅读并且非常适合压缩。我发现这是一个比明确写出组大小的案例更强大的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-25
        • 2020-07-29
        • 2015-06-14
        • 2020-05-02
        • 2023-03-22
        相关资源
        最近更新 更多