1. ホーム
  2. python

[解決済み] pandasのデータフレーム列のdtypesを割り当てる

2022-06-11 03:48:28

質問

を設定したい。 dtype に複数のカラムの pd.Dataframe (を使用することができないため、手動でパースしてリストのリストにしなければならなかったファイルがあります)。 pd.read_csv )

import pandas as pd
print pd.DataFrame([['a','1'],['b','2']],
                   dtype={'x':'object','y':'int'},
                   columns=['x','y'])

私は

ValueError: entry not a 2- or 3- tuple

設定する唯一の方法は、各カラムの変数をループして astype .

dtypes = {'x':'object','y':'int'}
mydata = pd.DataFrame([['a','1'],['b','2']],
                      columns=['x','y'])
for c in mydata.columns:
    mydata[c] = mydata[c].astype(dtypes[c])
print mydata['y'].dtype   #=> int64

もっと良い方法はないのでしょうか?

どのように解決するのですか?

0.17以降では、明示的な変換を使用する必要があります。

pd.to_datetime, pd.to_timedelta and pd.to_numeric

(後述するように、quot;magic"はもうありません。 convert_objects は0.17で非推奨になりました)

df = pd.DataFrame({'x': {0: 'a', 1: 'b'}, 'y': {0: '1', 1: '2'}, 'z': {0: '2018-05-01', 1: '2018-05-02'}})

df.dtypes

x    object
y    object
z    object
dtype: object

df

   x  y           z
0  a  1  2018-05-01
1  b  2  2018-05-02

これらを変換したい各カラムに適用します。

df["y"] = pd.to_numeric(df["y"])
df["z"] = pd.to_datetime(df["z"])    
df

   x  y          z
0  a  1 2018-05-01
1  b  2 2018-05-02

df.dtypes

x            object
y             int64
z    datetime64[ns]
dtype: object

と入力し、dtypeが更新されることを確認します。


pandas 0.12 - 0.16の古い/古い回答:次のように使うことができます。 convert_objects を使用すると、より良いdtypesを推論することができます。

In [21]: df
Out[21]: 
   x  y
0  a  1
1  b  2

In [22]: df.dtypes
Out[22]: 
x    object
y    object
dtype: object

In [23]: df.convert_objects(convert_numeric=True)
Out[23]: 
   x  y
0  a  1
1  b  2

In [24]: df.convert_objects(convert_numeric=True).dtypes
Out[24]: 
x    object
y     int64
dtype: object

マジック! (非推奨なのが悲しい)