Python 如何将缺少值的列转换为整数类型

Python 如何将缺少值的列转换为整数类型,python,python-3.x,pandas,integer,Python,Python 3.x,Pandas,Integer,我想将一列转换为整数,但问题是该列包含缺少的值。该列将转换为浮点精细,但不能转换为整数 示例代码: d2 = {'location': ['NY', 'NY', 'PA', 'NY', 'PA', 'PA', 'NY'], 'dep_name': ['hr', 'mk', 'fin', 'fin', 'hr', 'fin', 'fin'], 'Duration_of_Employment' : [10, 5, 9, 8, 2, 4, 7], 'Salary' : [50000, 86000,25

我想将一列转换为整数,但问题是该列包含缺少的值。该列将转换为浮点精细,但不能转换为整数

示例代码:

d2 = {'location': ['NY', 'NY', 'PA', 'NY', 'PA', 'PA', 'NY'], 'dep_name': ['hr', 'mk', 'fin', 'fin', 'hr', 'fin', 'fin'], 'Duration_of_Employment' : [10, 5, 9, 8, 2, 4, 7], 'Salary' : [50000, 86000,25000, 73000, 28000, 60000, 40000], 'Days_Since_Last_Promotion': ['61', '35', '25', '98', 'NaN', '45', '22']}
df2 = pd.DataFrame(data = d2)

df2['xy']  = df2['Days_Since_Last_Promotion'].astype(float)
df2['Months_Since_Last_Promotion'] = df2['xy'] // 30
现在“自上次促销起的月份”是浮动类型。但是当我尝试将其转换为整数时,我得到了以下错误

df2['Months_Since_Last_Promotion'] = df2['Months_Since_Last_Promotion'].astype(int)
ValueError:无法将NA转换为整数

从错误中,我估计是因为缺少Nan值,并尝试了这项工作。但它不起作用,“自上次升级以来的几个月”仍然显示为float64

df2.loc[df2['Months_Since_Last_Promotion'].notnull(), 'Months_Since_Last_Promotion'] = df2.loc[df2['Months_Since_Last_Promotion'].notnull(), 'Months_Since_Last_Promotion'].astype(int)
注意:我不能使用fillna替换NaN。目标是将列保持为整数


默认情况下,包含
NaN
值的数值列存储为浮点数(即使所有其他数字都是整数)-这是因为pandas中的类型转换限制。这意味着,如果您希望保持
NaN
不变,而不填充缺少的值,则(据我所知)将列强制转换为整数可能是不可能的。以下是文档的摘录:

“pandas支持存储整型和布尔型数组, 这些类型无法存储丢失的数据。除非我们能够 切换到在NumPy中使用本机NA类型,我们已经建立了一些 “强制转换规则”。当重新索引操作引入缺失数据时, 该系列将根据表中介绍的规则进行铸造 下面。”

请参阅:


包含
NaN
值的数值列默认情况下存储为浮点数(即使所有其他数字都是整数)-这是因为pandas中的类型转换限制。这意味着,如果您希望保持
NaN
不变,而不填充缺少的值,则(据我所知)将列强制转换为整数可能是不可能的。以下是文档的摘录:

“pandas支持存储整型和布尔型数组, 这些类型无法存储丢失的数据。除非我们能够 切换到在NumPy中使用本机NA类型,我们已经建立了一些 “强制转换规则”。当重新索引操作引入缺失数据时, 该系列将根据表中介绍的规则进行铸造 下面。”

请参阅:


实际上有一种方法:

就你而言:

df2['Months_Since_Last_Promotion'] = pd.array(df2['Months_Since_Last_Promotion'], dtype=pd.Int64Dtype())

但是,需要注意的是,其他软件可能无法将此列识别为
int
列。我认为这与python中的
NaN
float
有关。

实际上有一种方法:

就你而言:

df2['Months_Since_Last_Promotion'] = pd.array(df2['Months_Since_Last_Promotion'], dtype=pd.Int64Dtype())

但是,需要注意的是,其他软件可能无法将此列识别为
int
列。我认为这与python中的
NaN
是一个
float
有关。

不确定为什么不能使用fillna,你能详细说明一下吗?可能的重复要求是这样的,我们不希望用0或-1或类似的东西代替NaN。但我想在最坏的情况下,我会走这条路。我不知道为什么你不能使用fillna,你能详细说明一下吗?可能重复的要求是这样的,我们不想用0或-1或类似的东西来代替NaN。但我想在最坏的情况下,我会走这条路