当 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
和布尔值 False
到 0.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
。
如果您想在此列中包含混合值,即 bool
和 numpy.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
中保持混合值通常不是一个好的做法,因为它会大大降低性能,因此应尽可能避免。
干杯
我有一个类似于以下示例的数据框,其中一列包含 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
和布尔值 False
到 0.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
。
如果您想在此列中包含混合值,即 bool
和 numpy.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
中保持混合值通常不是一个好的做法,因为它会大大降低性能,因此应尽可能避免。
干杯