根据多个条件筛选Pandas行

24 投票
3 回答
50390 浏览
提问于 2025-04-18 04:28

我在 risk 这一列里有一些值,它们既不是 Small、也不是 MediumHigh。我想删除那些值不是 SmallMediumHigh 的行。我试过下面的代码:

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]

撰写回答