【问题标题】:Pandas Datatype Conversion issuePandas 数据类型转换问题
【发布时间】:2015-11-30 23:39:26
【问题描述】:

我有一个看起来像这样的 pandas 系列:一堆unicode 字符串

>>> some_id
0    400742773466599424
1    400740479161352192
2    398829879107809281
3    398823962966097921
4    398799036070653952
Name: some_id, dtype: object

我可以执行以下操作,但我失去了精度。

>>> some_id.convert_objects(convert_numeric=True)
0    4.007428e+17
1    4.007405e+17
2    3.988299e+17
3    3.988240e+17
4    3.987990e+17
Name: some_id, dtype: float64

但如果我执行some_id.astype(int),我会得到以下信息:ValueError: invalid literal for long() with base 10

如何在保持精度的同时将它们转换为 intint64 类型? 我正在使用熊猫0.16.2

更新:我发现了错误。 some_id.astype(int) 或任何其他形式的它应该可以工作。在我拥有的数千行中,some_id 有一个 textstring(不是 stringed 数字),因此它正在停止 int64 转换。

谢谢

【问题讨论】:

  • 如果你使用some_id.astype(np.int64)会发生什么?
  • 您使用的是什么版本的 Pandas。鉴于您上面的示例数据,将 some_id 从对象转换为 int(Pandas 0.14.1)没有任何问题。此外,您不会丢失精度转换为数字,它只是不显示。
  • @Alexander 可能是时候升级了 - 当前版本是 0.16.2 :)
  • @Alexander:实际上,如果转换为浮点数,精度会丢失。考虑int(float("100000000000000001")),它返回100000000000000000
  • @Alexander:你确实失去了精度,因为浮点数在这里表示的数字太多。拿OP的系列看ser.astype(np.int64) - ser.astype(float).astype(np.int64)

标签: python numpy pandas type-conversion


【解决方案1】:

Dagrha 是对的,你应该可以使用:

some_id.astype(np.int64)

类型将是:

In[40]: some_id.dtypes
Out[41]: 
some_id    int64
dtype: object

【讨论】:

    【解决方案2】:

    原始数字系列:

    s = pd.Series([400742773466599424, 400740479161352192, 398829879107809281,
                   398823962966097921, 398799036070653952], dtype=object)
    
    >>> s
    0    400742773466599424
    1    400740479161352192
    2    398829879107809281
    3    398823962966097921
    4    398799036070653952
    dtype: object
    

    只需使用.astype(int) 进行转换就足够了。

    >>> s.astype(int)
    0    400742773466599424
    1    400740479161352192
    2    398829879107809281
    3    398823962966097921
    4    398799036070653952
    dtype: int64
    

    作为一个有趣的旁注(正如@Warren Weckesser 和@DSM 所指出的),由于浮点表示,您可能会丢失精度。例如,int(1e23) 表示为 999999999999999991611392L。我不确定这是否是您提到的精度,或者您是否只是在谈论显示的精度。

    使用上面的示例数据,两个数字会相差一个:

    >>> s.astype(np.int64) - s.astype(float).astype(np.int64)
    0    0
    1    0
    2    1
    3    1
    4    0
    dtype: int64
    

    【讨论】:

      猜你喜欢
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 2016-05-23
      • 1970-01-01
      • 2023-03-13
      相关资源
      最近更新 更多