SQL Alchemy使用Or_循环多列(Pandas Dataframes)

问题描述 投票:0回答:2

概要:如何使用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像OR tbl.column1一样b ...)AND-等。

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

即(所需结果)

(tbl1.col1就像一个OR tbl.col1,像b或者tbl.col2,就像c或者tbl.col2一样,d或者tbl.col3就像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和column3的3个字符串的列表,因此我得到了指定的结果,但是,这只会产生:

(我实际上得到了什么)

(tbl.col1就像一个OR tbl.col1,就像b ..)AND(tbl.col2就像c OR tbl.col2一样d ...)AND(tbl.col3就像e OR ...)

有没有更好的方法在SQL Alchemy中获取我想要的结果,或者更好地找到一种方法将Pandas实现列值直接导入到getattr()中以将其用于我现有的代码?

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

python pandas dataframe sqlalchemy
2个回答
0
投票

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

我为这个问题道歉,如果有人对这个问题有任何意见或问题,我会帮助其他人解决这类问题。


0
投票

或者,我找到了一个更清洁的答案。如果您使用Python内置的getattr()函数,SQL Alchemy的OR_函数可以与变量列一起使用,您只需要创建(列,值)对,您可以在循环中解压缩它们。

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_语句中对哪个列进行分组,则可以将它们放入列表中并迭代它们。在这些内容中,您可以创建一个元组列表,您可以在其中创建所需的(列,值)对。然后在Or_函数中,您可以在循环中创建列和值,并相应地分配它们。代码必须更易于阅读,而且对于compack来说更多。我发现这是一个比明确写出组大小案例更强大的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.