【问题标题】:Are there any workarounds for pandas casting INT to Float when NaN is present? [duplicate]当存在 NaN 时,pandas 将 INT 转换为 Float 是否有任何解决方法? [复制]
【发布时间】:2017-01-16 08:48:39
【问题描述】:

尝试将我的列格式化为 INT,因为 1.0 2.0 3.0 会导致我使用数据的方式出现问题。我尝试的第一件事是df['Severity'] = pd.to_numeric(df['Severity'], errors='coerce')。虽然这看起来最初是有效的,但当我写信给 csv 时,它又恢复为浮动。接下来我尝试使用df['Severity'] = df['Severity'].astype(int),然后又尝试使用df['Severity'] = df['Severity'].astype(int, errors='coerce') 失败,因为这对我来说似乎是一个合乎逻辑的解决方案。

我对 pandas 的文档进行了一些挖掘,发现了有关 pandas 如何处理 NA 的内容:

Typeclass   Promotion dtype for storing NAs
floating    no change
object  no change
integer cast to float64
boolean cast to object

我觉得奇怪的是,当我运行 df.info() 时,我得到了Severity 452646 non-null object

样本数据:

Age,Severity
1,1
2,2
3,3
4,NaN
5,4
6,4
7,5
8,7
9,6
10,5

任何帮助将不胜感激:)

【问题讨论】:

  • 不幸的是,我发现这是熊猫的限制。
  • 嗯,这是一个相当大的耻辱,让我很难过:(
  • 您必须删除它们或用整数值替换它们,NaN 不能用整数表示,这与 pandas 无关,更多与 numpy 和一般意义上的数字表示有关计算机语言的限制。 C++ 和 python 以及许多其他语言可能存在同样的问题。你得到object 作为dtype,因为这里的类型是混合的,请参见:en.wikipedia.org/wiki/NaN
  • @EdChum,谢谢!将 NaN 设置为 0 适用于我的应用程序。
  • 特别是在那篇维基文章中:en.wikipedia.org/wiki/NaN#Integer_NaN

标签: python pandas int


【解决方案1】:

如何处理缺失值取​​决于您,没有正确的方法取决于您。您可以使用dropna 删除它们或使用replace/fillna 替换/填充它们,请注意,无法使用整数表示NaNhttps://en.wikipedia.org/wiki/NaN#Integer_NaN

你得到objectdtype 的原因是因为你现在混合了整数和浮点数。根据操作,整个系列可能会向上转换为 float,但在您的情况下,您有混合 dtypes。

【讨论】:

    【解决方案2】:

    从 pandas 0.24(2019 年 1 月)开始,可以使用 nullable integer data type 来做你想做的事,使用 arrays.IntegerArray 来表示数据:

    In [83]: df.Severity
    Out[83]:
    0    1.0
    1    2.0
    2    3.0
    3    NaN
    4    4.0
    5    4.0
    6    5.0
    7    7.0
    8    6.0
    9    5.0
    Name: Severity, dtype: float64
    
    In [84]: df.Severity.astype('Int64')
    Out[84]:
    0      1
    1      2
    2      3
    3    NaN
    4      4
    5      4
    6      5
    7      7
    8      6
    9      5
    Name: Severity, dtype: Int64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 2016-08-19
      • 2020-01-21
      • 1970-01-01
      • 2017-03-08
      相关资源
      最近更新 更多