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

时间:2018-12-07 21:43:03

标签: 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,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

现在“ Months_Since_Last_Promotion”为浮点型。但是,当我尝试将其转换为整数时,会出现以下错误。

df2['Months_Since_Last_Promotion'] = df2['Months_Since_Last_Promotion'].astype(int)
  

ValueError:无法将NA转换为整数

从错误中,我发现了由于缺少Nan值而引起的错误,并尝试了解决方法。但是它没有起作用,并且'Months_Since_Last_Promotion'仍显示为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。目标是将列保持为整数。

2 个答案:

答案 0 :(得分:2)

默认情况下,包含NaN值的数字列存储为浮点数(即使所有其他数字均为整数)-这是由于熊猫的类型转换限制所致。这意味着如果您想按原样保留NaN而不填充缺失值,则可能无法将列转换为整数(据我所知)。这是文档摘录:

  

“虽然熊猫支持存储整数和布尔类型的数组,   这些类型无法存储丢失的数据。直到我们可以   切换到在NumPy中使用本机NA类型,我们已经建立了一些   “广播规则”。当重新索引操作引入丢失的数据时,   系列赛将按照表格中介绍的规则进行   下面。”

请参考:

https://pandas.pydata.org/pandas-docs/stable/missing_data.html#missing-data-casting-rules-and-indexing

答案 1 :(得分:0)

实际上有一种方法:
https://pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html

在您的情况下:

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

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