为什么Pandas将我的numpy float32强制转换为float64?

时间:2016-02-05 17:47:07

标签: python numpy pandas coercion

为什么Pandas在这段代码中将我的numpy float32强制转换为float64:

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame([[1, 2, 'a'], [3, 4, 'b']], dtype=np.float32)
>>> A = df.ix[:, 0:1].values
>>> df.ix[:, 0:1] = A
>>> df[0].dtype
dtype('float64')

这种行为对我来说似乎很奇怪,不知道它是不是一个bug。我在Pandas版本0.17.1(更新的PyPI版本)上,我注意到最近有一些强制错误,请参阅https://github.com/pydata/pandas/issues/11847。我还没有尝试使用更新的GitHub主代码。

这是一个错误还是我误解了一些"功能"在熊猫?如果它是一个功能,那么我该如何解决它呢?

(胁迫问题涉及我最近询问的有关熊猫作业表现的问题:Assignment of Pandas DataFrame with float32 and float64 slow

2 个答案:

答案 0 :(得分:1)

我认为值得将此作为GitHub问题发布。这种行为肯定是不一致的。

代码根据DataFrame是否为混合类型(source)采用不同的分支。

  • 在混合类型的情况下,ndarray被转换为float64数字的Python列表,然后转换回float64 ndarray,忽略DataFrame的dtypes信息(function maybe_convert_objects())。

  • 在非混合类型的情况下,DataFrame内容几乎直接更新(source),而DataFrame保留其float32 dtypes。

答案 1 :(得分:1)

不是答案,而是我对问题的解答:

In [2]: df = pd.DataFrame([[1, 2, 'a'], [3, 4, 'b']], dtype=np.float32)
In [3]: df.dtypes
Out[3]: 
0    float32
1    float32
2     object
dtype: object
In [4]: A=df.ix[:,:1].values
In [5]: A
Out[5]: 
array([[ 1.,  2.],
       [ 3.,  4.]], dtype=float32)
In [6]: df.ix[:,:1] = A
In [7]: df.dtypes
Out[7]: 
0    float64
1    float64
2     object
dtype: object
In [8]: pd.__version__
Out[8]: '0.15.0'

我对pandas的{​​{1}}并不熟悉,但我很困惑为什么numpy给了我一个2列的结果。在ix[:,:1]中,这种索引只提供了1列。

如果我指定了一列numpy,则不会更改

dtype

没有混合数据类型的相同操作不会更改In [47]: df.ix[:,[0]]=A[:,0] In [48]: df.dtypes Out[48]: 0 float32 1 float32 2 object

dtypes

关键必须是混合值,数据框在某种意义上是In [100]: df1 = pd.DataFrame([[1, 2, 1.23], [3, 4, 3.32]], dtype=np.float32) In [101]: A1=df1.ix[:,:1].values In [102]: df1.ix[:,:1]=A1 In [103]: df1.dtypes Out[103]: 0 float32 1 float32 2 float32 dtype: object 数组,无论是内部数据存储,还是其dtype=object接口。< / p>

numpy