python - 为什么 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
存储为字符串。为什么会这样?我该如何解决这个问题?
解决方案
使用np.where
将创建一个 numpy 数组,在这种情况下使用字符串和np.nan
. 但是,运行类似
np.array(['a', np.nan])
会给array(['a', 'nan'], dtype='<U3')
。这里np.nan
已转换为'nan'
.
在这种情况下也会发生同样的情况,运行您的代码而不分配给带有一些示例数据的列(更改pd.np
为由np
tidakdiinginkan 评论):
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()
按预期使用。