Pandas .loc[] 副作用将布尔值更改为浮点数

Sar*_*son 2 python numpy nan pandas

df = pd.DataFrame({'b':[False,True,False,True,False]})

# changes all False values to NaN
df.loc[~df['b'], 'b'] = np.nan

print(df.to_dict())
# {'b': {0: nan, 1: 1.0, 2: nan, 3: 1.0, 4: nan}}
Run Code Online (Sandbox Code Playgroud)

由于 loc 仅更改列中的特定值,因此我期望类似{'b': {0: nan, 1: True, 2: nan, 3: True, 4: nan}},但情况并非如此。为什么 .loc 将布尔值更改为浮点数,对此有什么好的解决方法?

Joh*_*nck 6

boolPython 和 NumPy 和 Pandas 中的类型只能是 True 或 False。它不能是 NaN。因此,当您将 NaN 值引入bool(或int)系列时,它变成了float

一种替代方法是使用第二bool列来指示 NaN 值。另一种方法是使用 NumPy“屏蔽数组”。第三种可能是将列类型更改为i1并用于-1指示 NaN。