根据多个条件筛选Pandas行
我在 risk
这一列里有一些值,它们既不是 Small
、也不是 Medium
或 High
。我想删除那些值不是 Small
、Medium
和 High
的行。我试过下面的代码:
df = df[(df.risk == "Small") | (df.risk == "Medium") | (df.risk == "High")]
但是这样做返回的是一个空的表格。那我该怎么正确地筛选这些数据呢?
3 个回答
1
你也可以使用 query
这个方法:
df.query('risk in ["Small","Medium","High"]')
在这个方法中,如果你想用环境中的变量,可以在变量前面加一个 @
符号。例如:
lst = ["Small","Medium","High"]
df.query("risk in @lst")
如果列名有多个词,比如 "risk factor"
,你可以用反引号 ` `
把它包起来来引用它:
df.query('`risk factor` in @lst')
query
方法特别适合用来连接多个条件。如果你想用以下的过滤条件:
df[df['risk factor'].isin(lst) & (df['value']**2 > 2) & (df['value']**2 < 5)]
可以用下面的表达式来得到相同的结果:
df.query('`risk factor` in @lst and 2 < value**2 < 5')
4
另一种简单易懂的方法是这样的:
small_risk = df["risk"] == "Small"
medium_risk = df["risk"] == "Medium"
high_risk = df["risk"] == "High"
然后你可以这样使用它:
df[small_risk | medium_risk | high_risk]
或者
df[small_risk & medium_risk]
36
我觉得你想要的是:
df = df[(df.risk.isin(["Small","Medium","High"]))]
举个例子:
In [5]:
import pandas as pd
df = pd.DataFrame({'risk':['Small','High','Medium','Negligible', 'Very High']})
df
Out[5]:
risk
0 Small
1 High
2 Medium
3 Negligible
4 Very High
[5 rows x 1 columns]
In [6]:
df[df.risk.isin(['Small','Medium','High'])]
Out[6]:
risk
0 Small
1 High
2 Medium
[3 rows x 1 columns]