Pandasでデータ型を確認するdtype/dtypesと型変換を行うastype

この記事では、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のデータ型dtype一覧とastypeによる変換(キャスト) | note.nkmk.me pandas.Seriesは一つのデータ型dtype、pandas.DataFrameは列ごとにそれぞれデータ型dtypeを保持している。 dtypeは、コンストラクタで新たにオブジェクトを生成する際やCSV...

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では複数の型を持っている場合があることに注意しましょう。

この記事を書いた人

第一言語はPythonです。
皆さんRustやりましょう。

目次