如果满足 3 列中的条件,则将整行更改为 nan

Change entire row to nan if condition in 3 columns met

提问人:thefrollickingnerd 提问时间:3/1/2022 更新时间:3/1/2022 访问量:29

问:

我有一个数据框,其中包含 400 列频率数据和 3 列,其中包含泵 1 -> 3 是“正在运行”还是“停止”。

我想将整行更改为满足泵条件的 nan。(这是否会改变泵行并不重要,因为我在此之后删除了这些列)

例如,我试过

df[(df["Pump Set 1"] != "STOPPED") & (df["Pump Set 2"] != "STOPPED") & (df["Pump Set 3"] != "STOPPED")] = None

当我这样做并打印 df.head() 时,我看不到任何变化,但如果我尝试并

df = df[etc

我收到 none 类型错误。 我在网上看到的所有其他示例都需要指定要更改的列,我不想指定 400 列。

python-3.x pandas 数据帧

评论

0赞 Raymond Kwok 3/1/2022
这足以让您只保留所需的行。df[(df["Pump Set 1"] != "STOPPED") & (df["Pump Set 2"] != "STOPPED") & (df["Pump Set 3"] != "STOPPED")]
0赞 thefrollickingnerd 3/1/2022
好的,那么我如何保留所有值并将其更改为 nan

答:

2赞 jezrael 3/1/2022 #1

您可以将 DataFrame.loc 用于所有列::

mask = (df["Pump Set 1"] != "STOPPED") & 
       (df["Pump Set 2"] != "STOPPED") & 
       (df["Pump Set 3"] != "STOPPED")
df.loc[mask, :] = None

或者传递所有列:

df.loc[mask, df.columns] = None

评论

0赞 thefrollickingnerd 3/1/2022
它运行没有错误,但输出是未更改的数据帧,请注意,它只适用于一个条件,似乎不适用于所有三个条件
0赞 jezrael 3/1/2022
@thefrollickingnerd - 一个想法,如果检查是预期的?print (mask)Trues
0赞 thefrollickingnerd 3/1/2022
掩码似乎按预期工作,但 & 似乎不是排他性的。它似乎基本上充当 or 函数。哦,我需要使用不同的运算符
0赞 jezrael 3/1/2022
@thefrollickingnerd - 我问是因为也许如果单独检查,应该有一些像 .因此,如果检查,然后可以验证是否都按预期工作STOPPED print ((df["Pump Set 1"] != "STOPPED"))print ((df["Pump Set 2"] != "STOPPED"))print ((df["Pump Set 3"] != "STOPPED"))
1赞 thefrollickingnerd 3/1/2022
为了便于后代,我将 != 更改为 ==,以便它能找到所有泵都关闭的所有行(我想保留的内容),然后在 df.loc 语句 -> df.loc[~mask, df.columns] 中反转该掩码。