np.nan为什么存储为字符串,而不能使用isull()/ isna()/ notnull()/ notna()?

问题描述 投票:2回答:1

这是我分配的代码段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被存储为字符串。为什么会这样呢?我该如何解决?

python pandas numpy null series
1个回答
0
投票

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

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

将给出array(['a', 'nan'], dtype='<U3')。此处np.nan已转换为'nan'

在这种情况下,也会发生同样的情况,在不分配具有某些示例数据的列的情况下运行代码(如[tidakdiinginkan所注释的pd.np更改为np:]]

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()

© www.soinside.com 2019 - 2024. All rights reserved.