概要
データ分析を実施するとき、PythonのPandasを使って分析を行う、という人は多いと思います。分析をするときには、生データに含まれる不純なデータを使える形にしたり、アウトプットの体裁を整えたり、他のモジュールの機能を使うと言った用途のために、型変換は頻繁に発生すると思いますが、しばしばやり方を忘れ、毎度探すということが多いのではないでしょうか。(少なくとも私はそうでした)
本記事では、上記を踏まえて、データ分析でよく使う型変換のやり方についてまとめていきます。
数値→文字列の変換
まずは数値(intやfloat)として持っているデータを文字列に変換する方法です。一番簡単な方法はastypeを使う方法ですね。
こんなデータを対象にします。
test = pd.Series([10, 20.1, 0.03])
現在はfloatになっています。
0 10.00 1 20.10 2 0.03 dtype: float64
基本
astypeを使ってみましょう。
test.astype(str)
無事、object型になりました。
0 10.0 1 20.1 2 0.03 dtype: object
基本は上記でいいのですが、実際には桁数を揃えてゼロ埋めしたり、小数点の有効数字を考慮して文字列化したい場合もありますよね。その場合は以下のようにします。
小数点以下の桁合わせ
一発でできるコマンドはなさそうなので、format関数をapplyします。
test.apply(lambda x: '{:.4f}'.format(x))
小数点以下の桁数が4桁に揃った上でobject化されました。
0 10.0000 1 20.1000 2 0.0300 dtype: object
上位桁の0埋め(パディング)
astypeを使って文字列にした上で、padかzfillを使います。
#padの場合 test.astype('str').str.pad(10, fillchar='0') #zfillの場合 test.astype('str').str.zfill(10)
10桁になるように0埋めされました。
0 00000010.0 1 00000020.1 2 0000000.03 dtype: object
formatと組み合わせることも可能です。
test.apply(lambda x: '{:.4f}'.format(x)).str.pad(10, fillchar='0')
10桁になって小数点は4桁となるように0埋めされました。
0 00010.0000 1 00020.1000 2 00000.0300 dtype: object
文字列→数値の変換
次は反対に文字列を数値(intやfloat)に変換する方法です。こちらも一番簡単な方法はastypeを使う方法ですね。
こんな2種類のデータを対象にします。
test1 = pd.Series(['10', '20.1', '0.03'])
現在はobject型になっています。
0 10 1 20.1 2 0.03 dtype: object
こちらも同様ですが、Xという数値に変換できない値も混じっています。
test2 = pd.Series(['X', '20.1', '0.03'])
0 X 1 20.1 2 0.03 dtype: object
基本
astypeを使ってみましょう。
test1.astype(float)
無事、float型になりました。
0 10.00 1 20.10 2 0.03 dtype: float64
次はintにしてみます。
test1.astype(int)
すると以下のエラーが出ます。小数点以下は変換できないというエラーですね。
ValueError: invalid literal for int() with base 10: '20.1'
このような場合をintにしたい時は、一旦roundを使って桁を落としてからintにしなおしましょう。
test1.astype(float).round(0).astype(int)
無事、int型になりました。
0 10 1 20 2 0 dtype: int64
数値に変換できない文字列をNANにして変換
数値に変換できない文字列を含む場合、単純にastypeをしても以下のようなエラーが出て変換することが出来ません。
#Xという文字列を含むデータを対象にする test2.astype(float)
Xがコンバート出来ないというエラー。
ValueError: could not convert string to float: 'X'
このような場合は、pandasのto_numericメソッドを使い、オプションにcoerceを指定しましょう。
pd.to_numeric(test2, 'coerce')
こうすると、エラーが起きたデータはNANに置き換えて処理することが可能です。
0 NaN 1 20.10 2 0.03 dtype: float64
文字列→日付(datetime型)への変換
次は文字列を日付(datetime型)へ変換する方法です。これはPandasのto_datetimeというメソッドを使うことで変換可能です。
こんなデータを対象にします。
test3 = pd.Series(['20010105', '20010106', '20010107'])
現在はobject型になっています。
0 20010105 1 20010106 2 20010107 dtype: object
基本
pd.to_datetimeで変換します。
pd.to_datetime(test3)
無事datetime型に変換できました。
0 2001-01-05 1 2001-01-06 2 2001-01-07 dtype: datetime64[ns]
フォーマットの指定
次に、以下のデータのような特殊なフォーマットの場合について記載します。
test4 = pd.Series(['2001@01@05', '2001@01@06', '2001@01@07'])
このデータを単純に変換してもエラーが出ます。
pd.to_datetime(test4)
こんなフォーマットは分からない、というエラーですね。
ValueError: Unknown string format
こういったデータを扱う場合にはformatを指定します。
pd.to_datetime(test4, format='%Y@%m@%d')
正しく変換できました。
0 2001-01-05 1 2001-01-06 2 2001-01-07 dtype: datetime64[ns]
なお、上記では@のような特殊な例を上げましたが、ハイフンやスラッシュで区切っている場合など、ある程度は特に指定しなくても対応してくれます。
pd.to_datetime('2001-01-05 10:00:00')
これらについては以下記事を参考にしてみてください。
また、formatで指定できるYとかmについての説明は以下を参考にしてください。
https://docs.python.jp/3/library/datetime.html
日付に変換できない文字列をNATにして変換
以下のように変換できない場合についてです。
test5 = pd.Series(['20010105', '20010106', 'xxxx0107'])
普通に変換するとエラーが出ます。
ValueError: Unknown string format
coerceを指定します。
pd.to_datetime(test5, 'coerce')
こうすると、エラーが起きたデータはNATに置き換えて処理することが可能です。
0 2001-01-05 1 2001-01-06 2 NaT dtype: datetime64[ns]
まとめ
データ分析でよく使う型変換のやり方についてまとめました。こういったことにかける時間は分析の時間とは直接関わらないものですし、極力減らしていきたいですね。