首页 > 解决方案 > 为什么 np.nan 存储为字符串,无法使用 isnull()/isna()/notnull()/notna()?

问题描述

这是我分配的代码np.nan

df['column1'] = pd.np.where(df5.column5.str.contains("ABC"), "GHI",
               pd.np.where(df5.column5.str.contains("DEF"), "KLM", np.nan))

我想过滤掉'column1'是NaN的行。我尝试使用isnull()isna()但这些都不起作用。这里的工作如下:

df = df [df['column1'] != 'nan']

这意味着np.nan存储为字符串。为什么会这样?我该如何解决这个问题?

标签: pythonpandasnumpynullseries

解决方案


使用np.where将创建一个 numpy 数组,在这种情况下使用字符串和np.nan. 但是,运行类似

np.array(['a', np.nan])

会给array(['a', 'nan'], dtype='<U3')。这里np.nan已转换为'nan'.

在这种情况下也会发生同样的情况,运行您的代码而不分配给带有一些示例数据的列(更改pd.np为由nptidakdiinginkan 评论):

np.where(df5.column5.str.contains("ABC"), "GHI", 
  np.where(df5.column5.str.contains("DEF"), "KLM", np.nan))

给出:

array(['GHI', 'GHI', 'GHI', 'GHI', 'nan', 'nan', 'KLM', 'KLM'],
      dtype='<U32')

你可以做的是使用None而不是np.nan

df['column1'] = pd.np.where(df5.column5.str.contains("ABC"), "GHI",
               pd.np.where(df5.column5.str.contains("DEF"), "KLM", None))

这将允许您df['column1'].isnull()按预期使用。


推荐阅读