Pandas - 根据多个条件过滤

Pandas - Filter based on multiple conditions

当我需要按数据框排除某些行时,我遇到了问题。

这里是代码:

import numpy as np
import pandas as pd
dff = {
    'ID': [1, 2, 3, 4, 5, 6, 7],
    'Default': [1,1,0,1,0,1,0],
    'Default_Amount': [1200,2000,0,350,0,760,0],
    'Tot_Amount': [1200,2000,3400,350,10000,760,7500],
    'Time' : ['October','March','November','November','January','December','January'],
    'Class': ['A','B','A','A','B','B','A']
}
dff = pd.DataFrame(dff)
display(dff)

dff[(dff.Time != 'November') & (dff.Default == 1) ]

我想做的是排除数据框中具有以下两个条件的行:time = November with default = 1(即数据框中的 ID 4)。

但如果我执行此代码“dff[(dff.Time != 'November') & (dff.Default == 1) ]”,它也会排除其他时间 =“11 月”和默认值 = 0。

如何避免这个问题?

提前致谢!

您需要通过 |:

dff.Default != 1 与按位 OR 进行匹配
df = dff[(dff.Time != 'November') | (dff.Default != 1) ]

或反转掩码,但将 | 更改为 & 按位 AND 并将 != 更改为 ==:

df = dff[~((dff.Time == 'November') & (dff.Default == 1)) ]

这是简单的布尔代数

要么遵循 De Morgan's law 并在获得 OR (|) 时反转两个条件:

dff[(dff.Time != 'November') | (dff.Default != 1) ]

或添加(&)你的两个条件,并否定(~):

dff[~((dff.Time == 'November') & (dff.Default == 1)) ]

你为什么不简单地使用

dff[dff.ID != 4]

否则你可以使用

dff[~((dff.Time == 'November') & (dff.Default == 1))]

你的代码有问题 (dff.Time != 'November') 首先选择所有 non-November 行,然后 (dff.Default == 1) 选择所有默认为“1”的行。