【问题标题】:Casting NaN into int in a pandas Series在熊猫系列中将 NaN 转换为 int
【发布时间】:2014-10-28 19:48:13
【问题描述】:

我在系列的一列中缺少值,因此命令 dataframe.colname.astype("int64") 会产生错误。

有什么解决方法吗?

【问题讨论】:

  • NaN 不能表示为 Int64 因此错误,您可以将值转换为字符串,然后用字符串 NaN 替换缺失值,或者将其保留为浮点数支持NaN
  • 当前的dtype 是什么?你不能只用np.float64吗?
  • 实际上它是 float64,但它是小数,我想最终将这些值与数据库中的整数进行比较(它们是某种类型的 id)
  • 您必须选择如何处理这些值,将它们设置为一些 int 值,例如 -1 或删除它们

标签: python numpy pandas


【解决方案1】:

pd.Series 的数据类型或dtype 对它的实际使用方式几乎没有影响。

您可以有一个带有整数的pd.Series,并将dtype 设置为object。您仍然可以使用pd.Series 做同样的事情。

但是,如果您手动设置dtypespd.Series,pandas 将开始投射pd.Series 内的条目。根据我的经验,这只会导致混乱。

不要尝试使用dtypes 作为关系数据库中的字段类型。它们不是一回事。

如果您想在 pd.Series 中混合整数和 NaNs/Nones,只需将 dtype 设置为 object

dtype 设置为float 将让您将float 表示为ints 和NaNs 混合。但请记住,floats 很容易成为unexact in their representation

我应该提到dtypes 的一个常见缺陷是pd.merge 操作,当使用的键具有不同的dtypes,例如intobject,即使@ 987654349@ 只包含ints。

其他解决方法

  1. 您可以使用Series.fillna method 将您的NaN 值填充为不太可能的值。 0-1
  2. NaNs 复制到新列df['was_nan'] = pd.isnull(df['floatcol'])然后使用Series.fillna method。这样您就不会丢失任何信息。
  3. 调用Series.astype()方法时,给它关键字参数raise_on_error=False,如果失败就使用当前的dtype。因为dtypes 没那么重要。

TLDR;

不要专注于拥有“正确的 dtype”,dtype 很奇怪。专注于您希望专栏实际执行的操作。 dtype=object 很好。

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多