numpy “np.nan”未正确转换,但“None”可以

wyyhbhjk  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(124)

在下面的代码中,我生成了一些包含值np.nan的数据:

import pandas as pd
import numpy as np

n = 20
df = pd.DataFrame({"x": np.random.choice(["dog","cat",np.nan],n), "y": range(0,n)})

字符串
随后,我通过函数pd.notnull检查缺失值,这并不表示存在任何缺失值:

pd.notnull(df["x"])


好吧,原因是在创作中使用的np.nan不知何故被翻译成了字符串“nan”。但是为什么呢?例如,如果我用表达式中的None值替换np.nan,即如果我通过np.random.choice([“dog”,“cat”,None],n)创建数据,那么一切都正常。
有人能解释一下为什么np.nan没有正确转换吗?一般而言:如何在不使用np.nan或None对象的情况下为字符串列创建随机缺失数据?

sauutmhj

sauutmhj1#

np.random.choice创建了一个numpy数组,它只能保存一种类型的数据,你可以尝试用dtype=float手动设置数据类型(nan是一个浮点数),但这对字符串值不起作用。

options = np.array(["dog","cat",np.nan], dtype=float) # ValueError: could not convert string to float: 'dog'
df = pd.DataFrame({"x": np.random.choice(options,n), "y": range(0,n)})

字符串
edit:你可以将dtype设置为object,那么代码就可以工作了:

import pandas as pd
import numpy as np

n = 20
options = np.array(["dog","cat",np.nan], dtype=object)
print(options)
df = pd.DataFrame({"x": np.random.choice(options,n), "y": range(0,n)})
print(df)```

7qhs6swi

7qhs6swi2#

至于为字符串列创建随机缺失数据,可以使用.mask()

n = 20  
df = pd.DataFrame({"x": np.random.choice(["dog","cat"],n), "y": range(0, n)})  
mask = pd.Series(np.random.rand(n) < 0.33) # change to any fraction of missing values
df['x'] = df['x'].mask(mask)

字符串

相关问题