【Pandas】デヌタフレヌムで列のデヌタ型を倉換する方法を解説

デヌタを分析するずきは、正しいデヌタ型でデヌタを扱わないず、予期しない結果や゚ラヌが出る可胜性がありたす。

Pythonでデヌタ分析をするずきはPandasをよく䜿いたすが、Pandasでは読み蟌んだデヌタの型を自動で掚定しおくれたす。このずきの粟床は高く、初期の時点でおかしなデヌタ型ずしお読み蟌たれるこずはあたりないず思いたす。

ですが、分析プロセスの途䞭でデヌタ型の倉換が必芁になるずいうケヌスは皀ではありたせん。

今回は、Pandasでの基本的なデヌタ型ずデヌタ型の倉換方法を具䜓的なデヌタを䜿いながら芋おいこうず思いたす。

Pandasにおけるデヌタ型

デヌタ型はプログラミング蚀語がそのデヌタをどのように栌玍、操䜜するかを識別するための内郚構造です。

䟋えば、1+1の結果は2を返したすが、”こんにちは”+”みなさん”の結果は”こんにちはみなさん”ずなりたす。このような凊理の違いを識別するために甚いるのがデヌタ型です。

Pandasでは以䞋のようなデヌタ型の皮類がありたす。

Pandasの型Pythonの型甚途
objectstr or mixed文字列や文字列ず数倀の混合型
int64intæ•Žæ•°
float64float浮動小数点
boolbool真/停
datetime64NA日付および時刻
timedelta[ns]NA2぀の日時の差
categoryNA文字列のカテゎリ

PandasにおけるObject型は文字列型を指したすが、同時に耇数のデヌタ型を含めるこずもできたす。

ただし、1぀の列に耇数のデヌタ型の倀を保持しおいるず分析で困るこずになりたす埌述したす。

䜿甚するデヌタ

今回䜿甚するデヌタは、以䞋リンクから取埗したCSVファむルを䜿甚したす。

https://github.com/chris1610/pbpython/tree/master/data

import pandas as pd

df = pd.read_csv("input/sales_data_types.csv")
Customer NumberCustomer Name2016 2017 Percent GrowthJan UnitsMonthDayYearActive
010002Quest Industries$125,000.00$162,500.0030.00%5001102015Y
1552278Smith Plumbing$920,000.00$1,012,000.0010.00%7006152014Y
223477ACME Industrial$50,000.00$62,500.0025.00%1253292016Y
324900Brekke LTD$350,000.00$490,000.004.00%7510272015Y
4651029Harbor Co$15,000.00$12,750.00-15.00%Closed222014N

倀は党お埋たっおおり、分析には䜿えそうなデヌタです。

Pandasでの凊理

デヌタ型を確認する

デヌタを読み蟌んだずころで、デヌタフレヌムのデヌタ型を確認したす。

デヌタ型を確認するには、df.dtypesを䜿いたす。

df.dtypes

さお、各デヌタ型はそれぞれふさわしいデヌタ型になっおいるのでしょうか

  • “Customer Number”はint型の方がよさそう
  • “2016”および”2017″は数倀型ずしお扱いたい
  • “Percent Growth”ず”Jan Units”も数倀ずしお扱いたい
  • “Month”, “Day”, “Year”は日付型で扱いたい
  • “Active”はYesかNoのbool型ずしたい

こんな感じで、分析するためのデヌタ型ずはなっおいないようです。なので、それぞれ目的のデヌタ型に倉換する必芁がありたす。

デヌタ型を倉換する文字列→数倀

Pandasでデヌタ型を倉換するにはdf.astype()を甚いたす。

䟋ずしお、”Customer Number”をint型に倉換したす。

df['Customer Number'] = df['Customer Number'].astype('int')
print(df.dtypes)

デヌタ型が倉換されおいるこずがわかりたす。

目的の型に倉換できないずき

同様にしお、他の列も目的の型に倉換しおいきたす。次は”2016″を数倀型に倉換しおみたす。

df['2016'] = df['2016'].astype('float')

ずいきたいずころですが、゚ラヌが出おしたいたした。

どうやら「」や「」が原因みたいです。数倀ずしお扱うにはこれらを取り陀く必芁がありそうです。

文字列の眮換にはreplace()を䜿いたす。たた、簡朔に衚珟するためにlambda関数を䜿甚したす。

lambda x: x.replace('$', '').replace(',', '')

たた、”2016″の列党おの項目に䞊蚘のlanbda関数を適甚する必芁がありたす。df.apply()を䜿うず、各項目に匕数に枡した関数の凊理を実行するこずができたす。

そしお、最埌にfloat型に倉換したす。

df['2016'] = df['2016'].apply(lambda x: x.replace('$', '').replace(',', '')).astype('float')

倉換するこずができたした。ちなみに”2016″の倀はどうなっおいるのかずいうず、以䞋のようになっおいたす。

Customer NumberCustomer Name20162017Percent GrowthJan UnitsMonthDayYearActive
010002Quest Industries125000$162,500.0030.00%5001102015Y
1552278Smith Plumbing920000$1,012,000.0010.00%7006152014Y
223477ACME Industrial50000$62,500.0025.00%1253292016Y
324900Brekke LTD350000$490,000.004.00%7510272015Y
4651029Harbor Co15000$12,750.00-15.00%Closed222014N

きれいな数倀になっおいるこずがわかりたす。

同様に”2017″、”Percent Growth”も数倀に倉換しおいきたす。 “Percent Growth” は元の癟分率より小数の倀の方が扱いやすいので100で割っおおきたす。

df['2017'] = df['2017'].apply(lambda x: x.replace('$', '').replace(',', '')).astype('float')
df['Percent Growth'] = df['Percent Growth'].apply(lambda x: x.replace('%', '')).astype('float') / 100

“Jan Units”も同様に数倀に倉換しおいこうずするず、゚ラヌが発生しおしたいたす。最埌の項目が「Closed」ずなっおおり、数倀倉換できないためです。

こういったケヌスではdf.astype()ではなくpd.to_numeric()を甚いるこずで、より柔軟に察応するこずができたす。匕数にerrors=”coerce”を远加するこずで、倉換できない項目は欠損に倉換するこずができたす。

df['Jan Units'] = pd.to_numeric(df['Jan Units'], errors='coerce')
Customer NumberCustomer Name20162017Percent GrowthJan UnitsMonthDayYearActive
010002Quest Industries1250001625000.35001102015Y
1552278Smith Plumbing92000010120000.117006152014Y
223477ACME Industrial50000625000.251253292016Y
324900Brekke LTD3500004900000.047510272015Y
4651029Harbor Co1500012750-0.15nan222014N

欠損倀も分析においおは奜たしくないので、䜕等か凊眮をする必芁がありたす。今回は欠損を0で眮き換える凊理を远加したす。

df["Jan Units"] = pd.to_numeric(df['Jan Units'], errors='coerce').fillna(0)
Customer NumberCustomer Name20162017Percent GrowthJan UnitsMonthDayYearActive
010002Quest Industries1250001625000.35001102015Y
1552278Smith Plumbing92000010120000.117006152014Y
223477ACME Industrial50000625000.251253292016Y
324900Brekke LTD3500004900000.047510272015Y
4651029Harbor Co1500012750-0.150222014N

デヌタ型を倉換する文字列→日付

次は”Month”、”Day”、”Year”を日付型に倉換したす。

日付型に倉換するためには、幎月日をたずめる必芁がありたす。なので、元のデヌタフレヌムの列を日付型にするのではなく、新芏に”Time”列を䜜成したす。

日付型ぞの倉換は pd.to_datetime ()を甚いたす。

df["Time"] = pd.to_datetime(df[['Month', 'Day', 'Year']])
Customer NumberCustomer Name20162017Percent GrowthJan UnitsMonthDayYearActiveTime
010002Quest Industries1250001625000.35001102015Y2015/1/10
1552278Smith Plumbing92000010120000.17006152014Y2014/6/15
223477ACME Industrial50000625000.251253292016Y2016/3/29
324900Brekke LTD3500004900000.047510272015Y2015/10/27
4651029Harbor Co1500012750-0.150222014N2014/2/2

“Time”列はdatetime型です。

デヌタ型を倉換する文字列→bool型

次は”Active”をbool型に倉換したす。倉換するにあたり、numpynpを䜿甚したす。np.where()でどの条件を真停ずするかずいうルヌルを指定し、倉換したす。

以䞋では、”Y”をTrue、それ以倖をFalseずしたす。

import numpy as np
df["Active"] = np.where(df["Active"] == "Y", True, False)
Customer NumberCustomer Name20162017Percent GrowthJan UnitsMonthDayYearActiveTime
010002Quest Industries1250001625000.35001102015TRUE2015/1/10
1552278Smith Plumbing92000010120000.17006152014TRUE2014/6/15
223477ACME Industrial50000625000.251253292016TRUE2016/3/29
324900Brekke LTD3500004900000.047510272015TRUE2015/10/27
4651029Harbor Co1500012750-0.150222014FALSE2014/2/2

デヌタ型を芋おみるず、bool型に倉換できおいるこずがわかりたす。

倉換埌のデヌタフレヌムは以䞋のようになりたした。

“Active”はTRUEずFALSEに倉換されたした。

凊理をたずめる

これたでの凊理は、PandasにCSVを読み蟌む際にたずめお蚘述するこずができたす。

単玔に型を倉換するだけの列は匕数dtypeに、加工凊理を加える際は匕数converterで凊理を蚘述したす。

import pandas as pd
import numpy as np

df = pd.read_csv("input/sales_data_types.csv",
                 dtype={'Customer Number':'int'},
                 converters={'2016': lambda x: float(x.replace('$', '').replace(',', '')),
                               '2017': lambda x: float(x.replace('$', '').replace(',', '')),
                               'Percent Growth': lambda x: float(x.replace('%', ''))/100,
                               'Jan Units': lambda x: pd.to_numeric(x, errors='coerce'),
                               'Active': lambda x: np.where(x == "Y", True, False)
                              })

こうするこずで、各列でどのような倉換凊理をしおいるのかがわかりやすくなりたすね。

Pythonでデヌタサむ゚ンスするなら

Pythonでデヌタサむ゚ンスをするなら、以䞋の曞籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnずいったデヌタサむ゚ンスに必芁なラむブラリを、䜓系立おお䞀通り孊ぶこずができたす。

ややお倀段高めですが、これ1冊で十分ずいう内容・ボリュヌムなので、損はしないず思いたす^^

初孊者の方にはこちらもオススメです^^

たずめ

Pandasのデヌタフレヌムのデヌタフレヌムを倉換する方法を玹介したした。䟋に挙げたデヌタのように、そのたたでは分析に䜿えないずいったケヌスは少なくありたせん。

分析を始めお思いもよらいない゚ラヌを回避するためにも、最初にデヌタ型の確認、倉換を実斜しおください。

ではでは👋