簡體   English   中英

使用Or_循環多列的SQL Alchemy(Pandas數據框)

[英]SQL Alchemy using Or_ looping multiple columns (Pandas Dataframes)

簡介:如何在SQL Alchemy中使用OR_語句查詢來自具有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 OR 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中是否有更好的方法可以得到我想要的結果,還是找到一種使用Pandas直接在getattr()中實現列值以將其應用於現有代碼的方法更好?

感謝您的閱讀,並提前為您提供幫助!

看來我在格式化數據框的方式時遇到了問題,而且我在以不同的方式將列名讀入組中。 對於希望將多個df列處理到同一OR語句中的任何人,此模式都適用。

對於這個問題,我深表歉意,如果有人對這個問題有任何意見或疑問,我將幫助其他人解決這類問題。

另外,我找到了一個更干凈的答案。 如果使用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_函數中,向上循環修改列和值,並相應地分配它們。 該代碼必須更易於閱讀,而且要花很多錢才能獲得。 我發現這是一個比顯式寫出組大小的案例更可靠的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM