【问题标题】:NumPy or Pandas: Keeping array type as integer while having an 'inf' valueNumPy 或 Pandas:将数组类型保持为整数,同时具有“inf”值
【发布时间】:2020-04-25 22:44:37
【问题描述】:

现在,我知道新版本的 pandas 有一个特殊的数据类型扩展“Int64”,它允许缺失值与同一列中的整数共存,this 主题解释了这一点。但是,我想要一个整数列,它也允许无穷大值。但是,当我尝试将 float('inf') 添加到具有“Int64”类型的列中时,出现错误:“无法安全地将非等效 float64 转换为 int64”。

我想要在我的列中使用无穷大值的原因是我有一列整数距离,虽然其中一些距离是未知的,但已知这些距离超过了 3000 米。当我计算这一列的中位数时,它会有所不同。例如,数组 [1, 5, 10, 20, 50, nan, nan, nan] 的中位数为 10,因为 NaN 值被忽略。但是数组 [1, 5, 10, 20, 50, inf, inf, nan] 的中位数是 20,因为 inf 值被认为大于 50。

有没有办法使整数与“inf”值兼容?还是我必须凑合看?

【问题讨论】:

  • 你能用int64中的最大值代替inf吗,如果你的目的是得到一个数组的中位数,结果不会有太大变化吗?
  • 浮点数也是真正的整数。只是选择了特定的值来表示无穷大和 nan。您可以分配两个位模式来做同样的事情。您必须实施自己的处理来识别和屏蔽这些值。
  • 熊猫可以是对象 dtype,并且包含 int、np.nan、np.inf、None 和/或字符串
  • @hpaulj 尝试了您的建议。确实 int、nan 和 inf 都可以包含在“object”类型的列中,但看起来这种解决方案非常不稳定,只适合只读列。不仅这样的列将接受实际的实数而没有任何问题,这是不应该的 - 一个不太明显的问题是,即使我们非常小心地不让这种情况发生,这样的列仍然会恢复为“float64”键入它得到的任何机会。例如,“fillna()”方法将类型重新定义为它认为合适的类型,忽略填充系列和正在填充的列的类型。

标签: python pandas numpy type-conversion int


【解决方案1】:

Math inf 应该适用于您的情况 -

import math
import statistics as stat


test = math.inf
a = [1, 5, 10, 20, 50, test, test, float("nan")] 
print(stat.median(a))

【讨论】:

  • 我认为您在这里有点忽略了这一点。是的,math.inf 等价于float('inf'),但是不管我们用哪一个,一旦我们试图把这个列表变成一个Series,或者DataFrame 的一个列,它就会采用“float64”类型,进而将所有整数转换为实数。
  • 是的,你是对的,上面的解决方案并不真正适用于数据帧。
猜你喜欢
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多