在列表推导式中包含if或



在python 3.7中是否有一种方法可以在列表推导中检查2个条件?

e。g如果我有这个开始与以下只确保值不是nan:

[1 if x is not np.nan else 0 for x in df["value"]]

但是除了检查值是否为nan之外,我还想检查它是否为nan或者是否等于"N"比如:

[1 if (x is not np.nan) or (x != "N") else 0 for x in df["value"]]

实现这一点的最佳方法是什么?

谢谢你的帮助。

首先,使用is来检查变量是否为NaN可能是危险的。事实上,这取决于你考虑的是哪一种NaN:是来自math.nan还是numpy.nan?

一个更健壮的解决方案是使用numpy.isnan/pandas.isna/math.isnan方法。以下是numpy.isnan的示例:

import numpy as np
import math
numpy_nan = np.nan
math_nan = math.nan
print(np.isnan(numpy_nan)) # True
print(numpy_nan is np.nan) # True
print(np.isnan(math_nan)) # True
print(math_nan is np.nan) # False

正如你所看到的,最后一个例子被评估为False,而我认为你想要这个True


那么,回答你的问题:你可以在列表推导中添加很多不同的逻辑。然而,对于其他用户来说,它可能很难阅读,所以通常一个好的做法是定义一个带有逻辑的小函数。列表推导式将更容易理解:

import numpy as np
import pandas as pd
df = pd.DataFrame(
{
"value": [1, 0, np.nan]
}
)
def is_valid(x):
return not (np.isnan(x) or x == "N")
[1 if is_valid(x) else 0 for x in df["value"]] # [1, 1, 0]

最后,列表推导式中的if/else在您的情况下似乎是无用的。实际上,您正在尝试将值列表转换为1/0列表,这类似于True/False列表,因此您可以简单地执行以下操作:

import numpy as np
import pandas as pd
df = pd.DataFrame(
{
"value": [1, 0, np.nan]
}
)
def is_valid(x):
return not (np.isnan(x) or x == "N")
[is_valid(x) for x in df["value"]] # [True, True, False]

最新更新