[英]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.