Python2.7:无法使用np.where和np.nan方法创建空值

时间:2018-01-13 13:45:38

标签: python python-2.7 pandas numpy

我难以解决一个问题,即在使用np.where比较列(位置)中的2个行值后,将结果分配给新列(如果条件为假,则创建空值),我无法使用fillna方法将空值替换为新创建的列的值

使用df.isnull()。sum()检查空值时,结果显示新创建的列没有空值(即使我使用了np.nan)

总之,我想合并3列中的值:清除圈,超越,超越。

df['clear lap?'] = np.where((df['position'] == df['position'].shift()), str("clear"), np.nan)
df['overtaken'] = np.where((df['position'] > df['position'].shift()), str("got overtaken"), np.nan)
df['overtook'] = np.where((df['position'] < df['position'].shift()), str("overtook"), np.nan)

df['clear lap?'].fillna(df['overtaken'], inplace=True)
df['clear lap?'].fillna(df['overtook'], inplace=True)

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

让我们尝试一下。

>>> v = np.random.choice(2, 10) 
>>> v
array([0, 0, 1, 1, 0, 0, 0, 1, 1, 0])

>>> np.where(v, 'overtook', np.nan)
array(['nan', 'nan', 'overtook', 'overtook', 'nan', 'nan', 'nan',
       'overtook', 'overtook', 'nan'],
      dtype='<U32')

由于默认情况下np.where会返回一个具有同源dtype的数组,因此您将np.nan值强制转换为字符串,因此您获得'nan'而不是NaN

一种解决方法是使用pd.Series对象执行替换,例如

>>> s = pd.Series(v)
>>> m = s.gt(0)
>>> s[m] = 'overtook'
>>> s[~m] = np.nan
s
0         NaN
1         NaN
2    overtook
3    overtook
4         NaN
5         NaN
6         NaN
7    overtook
8    overtook
9         NaN
dtype: object

答案 1 :(得分:0)

COLDSPEED已经解释了会发生什么。我发现了一些其他类似的问题Numpy NaN returning as 'nan'

正如jezrael在上述问题中所建议的那样,尝试使用

df = df.replace('nan', np.nan)

如果您仍想使用np.where

,请解决此问题

另外,认为你可以使用

df.isin(["nan", np.nan])

df['clear lap?'].isin(["nan", np.nan])

检查系列或数据框中是否偶然创建了"nan"