繁体   English   中英

有 if 或 in 列表理解

[英]Having if or in list comprehension

在 python 3.7 中,有没有办法检查列表综合中的 2 个条件?

例如,如果我从以下开始,它只确保值不是 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


然后,回答您的问题:您可以在列表理解中添加许多不同的逻辑。 但是,其他用户可能难以阅读,因此一般来说,一个好的做法是使用逻辑定义一个小的 function。 列表理解会更容易理解:

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 在您的情况下似乎没用。 实际上,您正在尝试将值列表转换为类似于True / False列表的 1 / 0 列表,因此您可以简单地执行以下操作:

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM