为什么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)
答案 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