2016-02-05 6 views
5

はなぜパンダは、コードのこの部分でのfloat64に私のnumpyののfloat32を強制ん:それはバグであればパンダはなぜ私の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') 

行動はその不思議私にはとても奇妙に思えます。私はPandasバージョン0.17.1(アップデートされたPyPIバージョン)を使用していますが、最近対処されたバグを強制的に修正していることに注意してください。https://github.com/pydata/pandas/issues/11847を参照してください。私は更新されたGitHubマスターでコードの一部を試していません。

パンダのバグや誤解がありますか?それが機能の場合は、どうすれば回避できますか?

(強制変換の問題は、私は最近、パンダの割り当てのパフォーマンスについて尋ねた質問にも関する:Assignment of Pandas DataFrame with float32 and float64 slow

+0

これは奇妙かもしれませんが、numpyと一貫しています。 Numpyは自動的に整数もnumpy.float64型に変換します。 Pandasは中核となるので、この機能は期待されているIMOです(あなたのケースでは確かに理想的ではありませんが)。 – Benji

+0

しかし、 'pandas'は 'dtype = object'を使う傾向があり、普通のnumpyよりも使いやすいです。混合型を処理するときに柔軟性が増します。文字列は任意の長さでも、列同士でも混合することもできますが、柔軟性には計算コストとメモリコストが伴います。 – hpaulj

答えて

1

私はそれはGitHubの問題としてこれを掲示する価値があると思います。その行動は確かに矛盾している。

コードには、DataFrameが混在型であるかどうかに基づいて異なるブランチが使用されます(source)。 ndarrayはのfloat64数のPythonのリストに変換し、次にデータフレームのdtypes情報(function maybe_convert_objects())を無視ndarrayのfloat64に逆変換された混合型場合

  • 非混合型のケースでは、DataFrameコンテンツはほとんど直接更新され(source)、DataFrameはfloat32 dtypeを保持します。

+0

私は新しい問題を構築しました:https:// github。com/pydata/pandas/issues/12255 –

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' 

私はnumpyとしてpandasと同様に慣れていないんだけど、私はix[:,:1]は私に2列を与える理由として困惑しています結果。 numpyでは、インデックスの並べ替えはちょうど1列を与えます。

私は単一の列を割り当てた場合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の配列であり、その内部データ記憶域に該当するかどうか、あるいはnumpyインターフェース。

In [104]: df1.as_matrix() 
Out[104]: 
array([[ 1.  , 2.  , 1.23000002], 
     [ 3.  , 4.  , 3.31999993]], dtype=float32) 
In [105]: df.as_matrix() 
Out[105]: 
array([[1.0, 2.0, 'a'], 
     [3.0, 4.0, 'b']], dtype=object) 
+0

単一列とfor-loop over列名の割り当ては、「型内」(非キャスティング)割り当てに対して適切なパフォーマンスをもたらし、正しい型を生成するようです。しかし、float32とfloat64との間でキャストが行われている場合、この方法は2倍以上遅くなります。私は、複数の再配分が後者の問題を説明すると思います。 –

関連する問題