使用Or_循环多列的SQL Alchemy(Pandas数据框)

时间:2019-02-25 15:18:36

标签: python pandas dataframe sqlalchemy

摘要: 如何使用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是3个字符串的列表,分别对应于column1,column2和column 3,因此我得到了指定的结果,但是,这将简单地产生:

(我实际上得到了什么)

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

在SQL Alchemy中是否有更好的方法来获得所需的结果,还是找到一种直接将熊猫值实现为getattr()并将其工作到现有代码中的方法? / p>

感谢您的阅读,并提前获得您的帮助!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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_函数中,向上循环修改列和值,并相应地分配它们。该代码必须更易于阅读,而且要花很多钱才能获得。我发现这是一个比显式写出组大小的案例更可靠的解决方案。