我难以解决一个问题,即在使用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)
答案 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"
。