この記事では、PandasのSeriesやDataFrameの要素のデータ型と、Series型の要素の型変換をするastypeメソッドについて紹介します。
DataFrameは非常に柔軟なクラスなので、それぞれの列が別々のデータ型をもっていることがあります。
なのでDataFrame全体に対して型変換を一括で行うのではなく、列ごとに型変換をおこないます。
この記事で
- Pandasのデータ型とPython・NumPyのデータ型との対応
- Series、DataFrameのdtypeの確認
- astypeによるキャスト変更
を理解・習得して、Pandasにおける型の扱いを学びましょう。
Pandasのデータ型
Pythonのデータ型を元に、これに対応するPandasの代表的なデータ型とNumPyのデータ型を確認しましょう。
Pandas dtype | Python type | NumPy type | Usage |
---|---|---|---|
object | str | string_, unicode_ | Text |
int64 | int | int_, int8, int16, int32, int64, uint8, uint16, uint32, uint64 | Integer numbers |
float64 | float | float_, float16, float32, float64 | Floating point numbers |
bool | bool | bool_ | True/False values |
datetime64 | NA | datetime64[ns] | Date and time values |
timedelta[ns] | NA | NA | Differences between two datetimes |
category | NA | NA | Finite list of text values |
表引用:“Overview of Pandas Data Types” Posted by Chris Moffitt in articles
float32などの精度の違う型はもちろんPandasにもあります。
より細かいデータ型の一覧は、以下のサイト様で紹介されています。
Pandas.DataFrameのdtype/dtypes
NumPyの配列にはdtypeという属性がありました。
しかしDataFrameでは、列ごとに別のデータ型を持つことができます。
よってDataFrame自体にはdtype属性はありません。
そのかわりdtypesという列ごとにdtypeを表示する機能が用意されています。
import numpy as np import pandas as pd data = { "名前":["太郎","次郎","三郎"], "身長":[180.0, 170.0, 160.0], "年齢":[30,25,20], } a = pd.DataFrame(data)
dtypesでDataFrameの各列の属性を確認しましょう。
a.dtypes # 結果 名前 object 身長 float64 年齢 int64 dtype: object
ちなみにDataFrameのdtypeにアクセスするとErrorになります。
a.dtype # エラーメッセージ --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-25-b3cdf8323901> in <module> ----> 1 a.dtype ~/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py in __getattr__(self, name) 4374 if self._info_axis._can_hold_identifiers_and_holds_name(name): 4375 return self[name] -> 4376 return object.__getattribute__(self, name) 4377 4378 def __setattr__(self, name, value): AttributeError: 'DataFrame' object has no attribute 'dtype'
DataFrameのdtypeは列ごとに確認することができました。
DataFrameの各列はpd.Series型になっていて、Seriesはdtype属性を持っています。
実際にサンプルのDataFrameの各列について、dtypeを確認してみましょう。
print(a["名前"].dtype) print(a["身長"].dtype) print(a["年齢"].dtype) # 結果 object float64 int64
astypeでデータ型を変更
DataFrameの列やSeriesのデータ型を変更するメソッドとして、astypeが用意されています。
使い方はNumPyのastypeとほぼ同じです。
astypeの引数は
- Pythonのデータ型
- NumPyのデータ型
- 文字列としてPandasで使えるデータ型を指定
の3つの方法が使えます。
Pythonのデータ型で指定
a["年齢"].astype(float) # 出力 0 30.0 1 25.0 2 20.0 Name: 年齢, dtype: float64
また、astypeメソッドはオリジナルのオブジェクトを変更しないので、オブジェクト自体を変更したい場合は
a["年齢"]=a["年齢"].astype(float)
のように新しい値で元のオブジェクトを上書きしましょう。
NumPyのデータ型で指定
a["年齢"].astype(np.float32) # 出力 0 30.0 1 25.0 2 20.0 Name: 年齢, dtype: float32
文字列としてPandasで使えるデータ型を指定
a["年齢"].astype("float16") # 出力 0 30.0 1 25.0 2 20.0 Name: 年齢, dtype: float16
まとめ
この記事では、
- Pandasのdtype/dtypesの確認
- astypeによるデータ型の変更
について紹介しました。
dtypeがSeriesごとに決められていて、DataFrameでは複数の型を持っている場合があることに注意しましょう。