Если вы измените dtype
на np.object
, чтобы он поддерживал смешанные dtypes
и явно проверяли на False
, тогда это работает:
In[200]:
df = pd.DataFrame({'b':[False,True,False,True,False]})
df['b'] = df['b'].astype(np.object)
# changes all False values to NaN
df.loc[df['b']==False, 'b'] = np.nan
df
Out[200]:
b
0 NaN
1 True
2 NaN
3 True
4 NaN
Если вы попытались сделать df.loc[~df['b'],'b']=np.nan
то это вызывает ошибку:
KeyError: '[-1 -2 -1 -2 -1] not in index'
, если вы печатаете тип, тогда это показывает, что значения действительно являются float
и bool
:
print(type(df['b'].iloc[0]))
print(type(df['b'].iloc[1]))
<class 'float'>
<class 'bool'>
Как отмечено в другие ответы bool
не могут представлять NaN
, только float
dtype может, поэтому pandas
преобразует значение dtype
в Series
в наиболее совместимый тип, который в этом случае float
. Если вы установите для параметра dtype
значение np.object
, это позволяет использовать гетерогенный dtype
, поэтому нет преобразования dtype
.
UPDATE
Как отмечено в комментариях, использование смешанные типы будут сильно влиять на производительность и хранение, если у вас должны быть смешанные типы, тогда это единственный способ, которым это будет работать. В противном случае у вас может быть дополнительный столбец, чтобы просто пометить строки, которые NaN
, как было предложено.