如何修复:valueerror:无法使用包含 na/nan 值的非布尔数组进行掩码
使用 pandas 时可能遇到的错误是:
ValueError : Cannot mask with non-boolean array containing NA / NaN values
当您尝试在 pandas DataFrame 中查找包含特定字符串的行,但您正在搜索的列具有 NaN 值时,通常会发生此错误。
以下示例展示了如何在实践中纠正此错误。
如何重现错误
假设我们有以下 pandas DataFrame:
import pandas as pd
import numpy as np
#createDataFrame
df = pd. DataFrame ({' team ': ['A', 'A', 'A', 'B', 'B'],
' position ': ['Guard', 'Guard', np. nan , 'Guard', 'Forward'],
' points ': [22, 28, 14, 13, 19]})
#view DataFrame
print (df)
team position points
0 A Guard 22
1 A Guard 28
2 A NaN 14
3 B Guard 13
4 B Forward 19
现在假设我们尝试访问 DataFrame 中位置列包含字符串“Guard”的所有行:
#access all rows where position column contains 'Guard'
df[df[' position ']. str . contains (' Guard ')]
ValueError : Cannot mask with non-boolean array containing NA / NaN values
我们收到错误,因为位置列中有 NaN 值。
如何修复错误
要避免此错误,只需在str.contains()函数中使用na=False参数即可:
#access all rows where position column contains 'Guard', ignore NaN
df[df[' position ']. str . contains (' Guard ', na= False )]
team position points
0 A Guard 22
1 A Guard 28
3 B Guard 13
这次我们可以访问位置列中包含“Guard”的所有行,不会出现任何错误。
避免此错误的另一种方法是使用.fillna(False) ,如下所示:
#access all rows where position column contains 'Guard', ignore NaN
df[df[' position ']. str . contains (' Guard '). fillna ( False )]
team position points
0 A Guard 22
1 A Guard 28
3 B Guard 13
我们再次可以访问位置列中包含“Guard”的所有行,不会出现任何错误。
其他资源
以下教程解释了如何修复 Python 中的其他常见错误:
如何修复 Pandas 中的 KeyError
如何修复:ValueError:无法将 float NaN 转换为 int
如何修复:ValueError:操作数无法与形状一起广播