Pandas数据类型转换问题

时间:2015-09-04 18:24:18

标签: python numpy pandas type-conversion

我有一个看起来像这样的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类型? 我正在使用Pandas 0.16.2

更新:我发现了这个错误。 some_id.astype(int)或其他任何形式都应该有效。在我拥有的数千行的某个地方,some_id有string文本(不是字符串 ed编号),所以它停止了{{1}转换。

由于

2 个答案:

答案 0 :(得分:1)

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

some_id.astype(np.int64)

那么类型将是:

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

答案 1 :(得分:0)

原始数字系列:

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)表示为99999999999999991611392L。我不确定这是你所提到的精确度,还是你只是谈论显示的精度。

根据上面的示例数据,两个数字将被关闭:

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