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
もっと良い方法はあるでしょうか?
ベストアンサー1
0.17 以降では、明示的な変換を使用する必要があります。
pd.to_datetime, pd.to_timedelta and pd.to_numeric
(後述するように、「マジック」はなくなり、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
より良いdtypeを推論するには:
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
魔法!(廃止されるのは残念です。)