如果你遇到了 ValueError: Cannot mask with non-boolean array containing NA / NaN values
这个错误,这意味着你试图用一个包含 NA
或 NaN
值的非布尔数组来过滤你的 DataFrame。这通常发生在 .loc[]
或布尔索引操作中,如果生成的掩码(mask)数组中含有缺失值,Pandas 就无法正确地应用这个掩码。
要解决这个问题,你需要确保你的掩码数组是一个只包含 True
和 False
的布尔数组,并且不包含任何 NA
或 NaN
值。你可以通过填充缺失值或删除含有缺失值的行来解决这个问题。
以下是一些可能的解决方案
解决方案 1:填充缺失值
你可以使用 .fillna()
方法来填充掩码数组中的缺失值,例如用 False
填充
mask = df['column_name'].str.contains('R0900').fillna(False)
filtered_df = df.loc[mask]
解决方案 2:删除含有缺失值的行
如果你不想保留含有缺失值的行,你可以在创建掩码之前先删除它们
df_no_na = df.dropna(subset=['column_name'])
mask = df_no_na['column_name'].str.contains('R0900')
filtered_df = df_no_na.loc[mask]
解决方案 3:在创建掩码时排除 NaN
你还可以使用 .notnull()
方法来确保只在非缺失值的行上应用掩码
mask = df['column_name'].notnull() & df['column_name'].str.contains('R0900')
filtered_df = df.loc[mask]
这里,df['column_name'].notnull()
创建一个布尔数组,其中 True
表示对应行的 column_name
不是 NaN
,然后通过逻辑与操作符 &
与 str.contains('R0900')
的结果组合,确保只有在 column_name
非空且包含字符串 'R0900' 的行才会被选中。
选择哪种解决方案取决于你的具体需求和你想要如何处理 DataFrame 中的缺失值。通常,填充缺失值或删除含有缺失值的行是最常见的做法。