web-dev-qa-db-ja.com

pandas DataFrameの列ごとにdtypeを設定する方法

いくつかのデータをpandas DataFrameに持ち込み、インポート時に各列にdtypesを割り当てたいと思います。例:

_myarray = np.random.randint(0,5,size=(2,2))
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype=[float,int])
mydf.dtypes
_

結果:

TypeError:データ型が理解できません

私は次のような他のいくつかの方法を試しました:

_mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': int})
_

TypeError:タイプ 'type'のオブジェクトにはlen()がありません

dtype=(float,int)を配置すると、両方の列にfloat形式が適用されます。

最後に、列名のリストを渡すのと同じ方法で、データ型のリストを渡すことができるようにしたいと思います。

33
Chris

pandasバージョン0.24.2(現在の安定版リリース)の時点で、ドキュメントの状態としてDataFrameコンストラクターにデータ型の明示的なリストを渡すことはできません。

dtype : dtype, default None

    Data type to force. Only a single dtype is allowed. If None, infer

ただし、データフレームクラスには静的メソッドがあり、numpy構造化配列をデータフレームに変換できるため、次のことが可能になります。

>>> myarray = np.random.randint(0,5,size=(2,2))
>>> record = np.array(map(Tuple,myarray),dtype=[('a',np.float),('b',np.int)])
>>> mydf = pd.DataFrame.from_records(record)
>>> mydf.dtypes
a    float64
b      int64
dtype: object
2
user545424

私はこれに遭遇しましたが、pandasの問題はまだ開いているので、回避策を投稿しています。dfが私のDataFrameであり、dtypeが列名を型にマッピングするdict:

_for k, v in dtype.items():
    df[k] = df[k].astype(v)
_

(注:python 2)でdtype.iteritems()を使用してください)

参考のために:

14
mattexx

SeriesオブジェクトのディクショナリをDataFrameコンストラクターに渡すことをお勧めします-作成をより具体的に制御できるようになります。テンプレートバージョン(data1は配列などです。):

df = pd.DataFrame({'column1':pd.Series(data1, dtype='type1'),
                   'column2':pd.Series(data2, dtype='type2')})

データの例:

df = pd.DataFrame({'A':pd.Series([1,2,3], dtype='int'),
                   'B':pd.Series([7,8,9], dtype='float')})

print (df)
   A  B
0  1  7.0
1  2  8.0
2  3  9.0

print (df.dtypes)
A     int32
B    float64
dtype: object
3
DBCerigo

データ型を操作している間は、文字列として渡す必要があります。

たとえば、従った後者の方法は次のように変更する必要があります

mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **'int'**})

の代わりに

mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **int**})

dtype (int, float etc.)は文字列として指定する必要があります。

または、代替方法として(文字列として渡したくない場合)numpyをnpとしてインポートを使用し、mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **np.int**})を使用します

0
user10983117