【问题标题】:How to filter pandas DataFrame based on SQL conditions in Python?如何在 Python 中根据 SQL 条件过滤 pandas DataFrame?
【发布时间】:2018-03-03 22:18:03
【问题描述】:

我想将我的 SQL 代码转换为 Python (pandas) 过滤器函数,但这给我带来了困难。知道如何在不循环记录的情况下根据 SQL 条件过滤数据吗? Value 检查 Desc = 'Bla1' 会有所不同。

如果joe_doe:使用Hello = 1 保存记录;其他:保存记录 Hello = 0

SQL

Hello =
        CASE
            WHEN
            (
                Desc = 'Bla1'
                AND Value = 'True'
            )
            OR
            (
                Desc IN('Bla2', 'Bla3')
                AND Active = 'True'                 
            )
            AND Enabled = 'True'
            THEN 1
            ELSE 0

Python(包括熊猫)

def get_it(john_doe, df):

    sentences = {
            'Bla1': 'Value',
            'Bla2': 'Active',
            'Bla3': 'Active'
        }

    if john_doe:
        df = df[HOW TO KEEP ALL RECORDS THAT HAVE Hello = 1?]
    else:
        df = df[HOW TO KEEP ALL RECORDS THAT HAVE Hello = 0?]
    return df

数据帧输入

id | Desc | Active | Enabled | Value | [A LOT OF OTHER COLUMNS]
1  | Bla2 | 1      | 0       | 1     | [A LOT OF OTHER COLUMNS]
2  | Bla3 | 1      | 1       | 1     | [A LOT OF OTHER COLUMNS]
3  | Bla3 | 1      | 1       | 0     | [A LOT OF OTHER COLUMNS] 
4  | Bla4 | 1      | 1       | 1     | [A LOT OF OTHER COLUMNS]
5  | Bla6 | 1      | 1       | 0     | [A LOT OF OTHER COLUMNS]
6  | Bla7 | 0      | 0       | 1     | [A LOT OF OTHER COLUMNS]
7  | Bla1 | 0      | 1       | 1     | [A LOT OF OTHER COLUMNS]
8  | Bla1 | 1      | 1       | 0     | [A LOT OF OTHER COLUMNS]

IF JOE_DOE 需要输出数据帧

id | Desc | Active | Enabled | Value | [A LOT OF OTHER COLUMNS]
2  | Bla3 | 1      | 1       | 1     | [A LOT OF OTHER COLUMNS]
3  | Bla3 | 1      | 1       | 0     | [A LOT OF OTHER COLUMNS]
7  | Bla1 | 0      | 1       | 1     | [A LOT OF OTHER COLUMNS]

ELSE 需要输出数据帧

id | Desc | Active | Enabled | Value | [A LOT OF OTHER COLUMNS]
1  | Bla2 | 1      | 0       | 1     | [A LOT OF OTHER COLUMNS]
4  | Bla4 | 1      | 1       | 1     | [A LOT OF OTHER COLUMNS]
5  | Bla6 | 1      | 1       | 0     | [A LOT OF OTHER COLUMNS]
6  | Bla7 | 0      | 0       | 1     | [A LOT OF OTHER COLUMNS]
8  | Bla1 | 1      | 1       | 0     | [A LOT OF OTHER COLUMNS]

【问题讨论】:

  • 这个问题令人困惑——你能附上你的 df 样本吗?你是想模仿 case 语句,还是只需要知道在 if 语句中放什么?
  • 我想根据 Python/pandas 中的 SQL 条件过滤我的df。在if 我想根据 SQL 中的条件(THEN 1)保留所有记录。在else我想保留所有不符合SQL条件的记录(ELSE 0
  • sentences 字典包含所有 SQL 案例,因为 Bla1 会检查 Value 字段。另外 2 个检查 Active 字段。

标签: python sql pandas dataframe filter


【解决方案1】:

这样的事情应该可以工作。 Pandas 可以采用任意数量的逻辑参数来过滤数据框。 &| 用于分隔参数,~ 用于否定参数。我不明白您构建的dict 的必要性,我认为在这种情况下没有必要。

logic1 = (df.Desc=='Bla11') & (df.Value==1) & (df.Enabled==1)
logic2 = (df.Desc=='Bla12') & (df.Active==1) & (df.Enabled==1)
logic3 = (df.Desc=='Bla13') & (df.Active==1) & (df.Enabled==1)

if joe_doe:
     df = df[logic1 | logic2 | logic3]
else:
     df = df[~logic1 & ~logic2 & ~logic3]
return df

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2014-08-12
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    相关资源
    最近更新 更多