2016-06-23 8 views
0

私は、Python 2.7.xでPandas 0.18.1を使用しています。私は最初に読んだ空のデータフレームを持っています。私はこれらの列のタイプがOKであるobjectであることを知ります。 1行のデータを割り当てると、数値のタイプはfloat64に変わります。私はintまたはint64を期待していました。なぜこれが起こるのですか?パンダ:数値浮動小数点のデフォルトの列型はなぜですか?

いくつかのグローバルオプションを設定する方法があります。数字の場合、データが.でない限り、デフォルトでintとして扱われます。たとえば、[0 1.0, 2.]、最初の列はintですが、他の2つはfloat64ですか?例えば

>>> df = pd.read_csv('foo.csv', engine='python', keep_default_na=False) 
>>> print df.dtypes 
bbox_id_seqno object 
type    object 
layer   object 
ll_x    object 
ll_y    object 
ur_x    object 
ur_y    object 
polygon_count object 
dtype: object 
>>> df.loc[0] = ['a', 'b', 'c', 1, 2, 3, 4, 5] 
>>> print df.dtypes 
bbox_id_seqno  object 
type    object 
layer    object 
ll_x    float64 
ll_y    float64 
ur_x    float64 
ur_y    float64 
polygon_count float64 
dtype: object 

答えて

3

パンダがNaNの値を整数列に格納することはできません。

floatは、欠落値が発生するとすぐに、Pandasが列全体のデータ型を変更する必要があるため、データ格納のデフォルトの選択肢となります。実際には欠損値が頻繁に発生します。

の理由は、ですが、これはNumpyから継承された制限です。基本的には、パンダはNaNを表す特定のビットパターンを脇に置く必要があります。これは浮動小数点数に対しては簡単で、IEEE 754標準で定義されています。固定幅の整数に対してこれを行うのは、より扱いにくく、効率的ではありません。

2

なぜ柔軟性とスピードで行うことはほぼ確実です。 Pandasがこれまでの列の整数しか見ていないからといって、後で浮動小数点数を追加しようとしているわけではありません。Pandasに戻ってその列すべての型を変更する必要があります。浮動小数点型は最も強固で柔軟な数値型です。

(私が知っている)その動作をオーバーライドするグローバルな方法はありませんが、astypeメソッドを使用して個々のDataFrameを変更できます。

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.astype.html

3

あなたは空のデータフレームを読んでいる場合は、明示的にそれを読んだ後、各列の型をキャストすることができます。

dtypes = { 
    'bbox_id_seqno': object, 
    'type': object, 
    'layer': object, 
    'll_x': int, 
    'll_y': int, 
    'ur_x': int, 
    'ur_y': int, 
    'polygon_count': int 
} 


df = pd.read_csv('foo.csv', engine='python', keep_default_na=False) 

for col, dtype in dtypes.iteritems(): 
    df[col] = df[col].astype(dtype) 

df.loc[0] = ['a', 'b', 'c', 1, 2, 3, 4, 5] 

>>> df.dtypes 
bbox_id_seqno object 
type    object 
layer   object 
ll_x    int64 
ll_y    int64 
ur_x    int64 
ur_y    int64 
polygon_count  int64 
dtype: object 

あなたの空のデータフレーム内の列名がわからない場合は、最初にint、すべてを割り当て、パンダのソートにそれを出すことができます。

for col in df: 
    df[col] = df[col].astype(int) 
関連する問題