当 pandas 列中的值更改为 nan 时,真值变为 1

True values become 1 when a value in pandas column is changing to nan

我有一个类似于以下示例的数据框,其中一列包含 True 或 Nan:

df = pd.DataFrame({'Data': [1, 2, 3, 4, 5], 'T/F':[True, True, True, True, True]})

Data   T/F
0     1  True
1     2  True
2     3  True
3     4  True
4     5  True

我想尝试从该数据帧的最后一行中删除 true,但是当我这样做时,所有其他 True 变为 1:

df.loc[df.last_valid_index(), 'T/F'] = np.nan

   Data  T/F
0     1  1.0
1     2  1.0
2     3  1.0
3     4  1.0
4     5  NaN

我想知道是否有人知道为什么会这样?有什么办法可以阻止它吗?我在想我可能需要更改我的代码以使用 False 而不是 nan。

您可以使用 pd.NA 代替:

df.loc[df.last_valid_index(), 'T/F'] = pd.NA

df的输出:

    Data    T/F
0   1       True
1   2       True
2   3       True
3   4       True
4   5       <NA>

注意: 因为 np.nan 的类型是 float 所以它把布尔值 True 转换成 1.0和布尔值 False0.0

另外 pd.NA 保留数据类型,您可以通过以下方式检查:

print(df['T/F'].map(type))

#output of above code:

0                           <class 'bool'>
1                           <class 'bool'>
2                           <class 'bool'>
3                           <class 'bool'>
4    <class 'pandas._libs.missing.NAType'>
Name: T/F, dtype: object

一列,一种类型,当您设置值np.nan时,程序会将此列转换为浮点数。在我的记忆中,df.astype() 函数只处理列,而不是 ceil。

这是因为 T/F 列包含 bool 数据,而您尝试分配的值是 numpy.float64 类型,因此该列被转换为最高相互 dtype,在本例中为 numpy.float64

如果您想在此列中包含混合值,即 boolnumpy.float64,您应该在更新前将此列转换为 object,如下所示:

import pandas as pd
import numpy as np

df = pd.DataFrame({'Data': [1, 2, 3, 4, 5], 'T/F':[True, True, True, True, True]})
df['T/F'] = df['T/F'].astype('object')
df.loc[df.last_valid_index(), 'T/F'] = np.nan
df

输出:

    Data    T/F
0   1   True
1   2   True
2   3   True
3   4   True
4   5   NaN

注意: 在 pandas.DataFrames 中保持混合值通常不是一个好的做法,因为它会大大降低性能,因此应尽可能避免。

干杯