无法使用包含 NA / NaN 值的非布尔数组进行掩码...但没有任何缺失值

K C*_*man 21 python dataframe pandas

我本来可以正常工作,但现在我改变了“某些东西”,它就不再工作了。我在 Excel 中有一个表,我正在将其读入 df. 这按预期工作。我读入它,然后对其进行过滤,这样我就只有符合特定条件的数据行。这是代码:

    df = excel_range_upper_left.options(pd.DataFrame, expand='table', header=1,
            index=False).value

    print(f'Check for missings')
    for c in df.columns:
        count = df[c].isnull().sum()
        print(f'Col {c} has {count} missing values')
    print(f'Done checking for missings')

    df = df[df["Phase"].str.contains('2')]  #, na=False)]
Run Code Online (Sandbox Code Playgroud)

for 循环循环遍历 df 列以查找缺失值。它们全部返回为 0 个缺失值。

然后我执行最后一条语句,它(我认为)应该简单地将 df 过滤为一个新的 df(同名),该新的 df 在“Phase”列中必须具有字符串值“2”。以及它出错的地方Cannot mask...

我的猜测是表中的某处仍然缺少值,但我已经用尽了找到它的能力(我也尝试了以下操作 - 但它的结果与原始 df 相同,并且仍然出错:

    print(f'{exer_df.dropna(axis=1)}')
Run Code Online (Sandbox Code Playgroud)

如果我将过滤器行更改为以下内容,使其包含该na=False选项,则一切正常。但我不知道为什么...

exer_df = exer_df[exer_df["Phase"].str.contains('2', na=False)]
Run Code Online (Sandbox Code Playgroud)

有人有任何见解和帮助吗?

为了完整起见,以下是 for 循环的结果和错误:

Check for missings
Col Type as 0 missing values
Col Sub-Type as 0 missing values
Col Phase as 0 missing values
Col Body Parts as 0 missing values
Col Sets as 0 missing values
Col Reps as 0 missing values
Col Tempo as 0 missing values
Col Intensity as 0 missing values
Col Rest Period as 0 missing values
Col Exercise as 0 missing values
Col Prim Mover as 0 missing values
Done checking for miossings
Traceback (most recent call last):
  File "c:/Users/kirby/OneDrive/Beating Old Age Book/Blog Page Text/nutrition/calculations/plan_creator.py", line 271, in <module>
    mcp()
  File "c:/Users/kirby/OneDrive/Beating Old Age Book/Blog Page Text/nutrition/calculations/plan_creator.py", line 188, in mcp
    exer_df = exer_df[exer_df["Phase"].str.contains('2')]  #, na=False)]
  File "C:\Users\kirby\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pandas\core\frame.py", line 3014, in __getitem__
    if com.is_bool_indexer(key):
  File "C:\Users\kirby\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pandas\core\common.py", line 114, in is_bool_indexer
    raise ValueError(na_msg)
ValueError: Cannot mask with non-boolean array containing NA / NaN values
Run Code Online (Sandbox Code Playgroud)

小智 26

正如原始海报已经指出的那样,使用参数na=False一切都应该正常工作。

如果您尝试在导入的 Excel DataFrame 中使用Series.str.contains空白值,则会引发 ValueError:“无法使用包含 NA / NaN 值的非布尔数组进行掩码

指定naFalse( na=False),将 NaN 值替换为 False 值并避免此错误;另一种解决方案是Series.fillna(False)在调用该函数之前。

不知何故,使用其他填充值在这种特定情况下不起作用,它需要是 Bool。


小智 7

我刚刚通过这样做摆脱了类似的事情(错误的文本完全相同):

df.dropna()[df.dropna()['Label'].str.contains('target')]
Run Code Online (Sandbox Code Playgroud)

因此,道德可能是您也需要将 NaN 放在括号内。