スライドショー

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にもあります。

より細かいデータ型の一覧は、以下のサイト様で紹介されています。

https://note.nkmk.me/python-pandas-dtype-astype/

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

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

フクロウ

フクロウ

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

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説