代码之家  ›  专栏  ›  技术社区  ›  singularity2047

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

  •  0
  • singularity2047  · 技术社区  · 6 年前

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

    示例代码:

    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)
    

    从错误中,我计算出它是由于缺少值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。目标是将列保持为整数。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Vishnu Kunchur    6 年前

    数值列包含 NaN 默认情况下,值存储为浮点数(即使所有其他数字都是整数),这是因为panda中的类型转换限制。这意味着如果你想保留 正如没有填充缺少的值一样,将列强制转换为整数可能是不可能的(据我所知)。以下是文档摘要:

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

    请参考:

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

        2
  •  0
  •   Mór Kapronczay    5 年前

    实际上有一种方法:
    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 作为一个 float 在巨蟒中。