▶ 初学者向けにデータ分析に関する記事を書いています
はじめに
今回は組み込み関数であるstr()と型変換をするメソッドastype(str)について基本から解説していきます。皆さんは、これらの2つの違いが判りますか?わたしはこれらがごっちゃになって、データフレームの列の型変換にてこずったことが何度かあります。同じ経験がある方は是非、本記事をご覧ください。この記事を読めばもう迷うことはありません。
型の変換
型の変換をするには組み込み関数のstr()やint()を使ったり、astype(str)やastype(int)を使いますが、これらの違いが判りますか?まずはこれを整理しましょう。今回はstr()とastype(str)に絞って解説することにします。
str()
pythonの組み込み関数であるstr()やint()は引数に指定した「オブジェクト」を文字列や整数型に変換する関数です。書式を確認しておきましょう。
引数には数値やリスト、タプルを指定することができます。いくつか確認しておきましょう。
# 数値を文字列に変換
str(51)
# 数値のリストを文字列に変換
str([1,2,3])
# 数値のタプルを文字列に変換
str((1,2,3))
ここまでよろしいでしょうか?数値を文字列に変換することはあまり誤解がないかと思いますが、数値のリストを文字列に変換する場合、「リスト要素の一つ一つが文字列に変換されるわけではありません」あくまで、「リスト」というオブジェクトが文字列に変換されます。そのため、返り値は'[1,2,3]’となります。これをよく覚えておきましょう。
astype(str)
次にastype(str)による文字列への型変換を確認しましょう。astype(str)はSeriesのデータ型dtypeを文字列型に変更したり、DataFrame全体のデータ型dtypeを一括で文字列型に変更、あるいは、DataFrameの特定の列のデータ型dtypeを文字列型に変更します。こちらもまずは書式を確認しておきましょう。
こちらもいくつか確認しておきましょう。まずはサンプルデータを作ります。
# ライブラリのインポート
import pandas as pd
import numpy as np
import math
# サンプルデータの作成
animals = ['らくだ', 'ねこ', 'きりん', 'ぞう', 'しまうま']
age = [32, 28, 31, 23, 42]
df = pd.DataFrame({'なまえ':animals,'ねんれい':age})
df
「ねんれい」の列を文字列型に変換してみましょう。
# 「ねんれい」の列を文字列型に変換
df['ねんれい'].astype(str)
dtype: objectとなっていますね。pandasのobject型は複数のデータ型を含めることができ、文字列型もobject型として表されます。なので、うまく変換できてますね。
str()とastype(str)の違い
既に見てきたように、str()は指定したオブジェクトを文字列型に変換、astype(str)はデータフレーム全体、あるいは、特定の列の型を文字列型に変換します。この違いがわかりますか?
簡単な例で説明します。データフレームの「ねんれい」の列を使って「年代」をつくることにしましょう。いま「ねんれい」の列はint型になっています。なので、「ねんれい」を10で割って小数点以下を切り捨てて、それを10倍すればよいですね。やってみましょう。
# 年代を計算する
df['ねんれい'].apply(lambda x:np.floor(x/10)*10)
うまくいってますね。「年代」の列にはこのままの数字を入れるのではなく、20代、30代のような表記をすることにしましょう。上記の計算で求めたものはfloat64型、「代」は文字列型なので、まずは型を揃える必要がありますね。文字列型に揃えて足し算をすればよさそうです。
str()、astype(str)のどちらを使えばよいでしょうか?
ここでは両方で試してみましょう。
# str()
df['年代1'] = str(df['ねんれい'].apply(lambda x:math.floor(x/10)*10)) + '代'
# astype(str)
df['年代2'] = df['ねんれい'].apply(lambda x:math.floor(x/10)*10).astype(str) + '代'
# 結果の確認
df
「年代1」はstr() , 「年代2」はastype(str)を使って処理をしています。「年代1」はうまく処理できていませんね。これは、「df[‘ねんれい’].apply(lambda x:math.floor(x/10)*10)」の返り値はSeriesオブジェクトであり、そのオブジェクトを文字列型に変換しているからです。Series全体の型を文字列型に変換(各要素を文字列型に変換)するには、astype(str)を使います。
まとめ
今回はstr()とastype(str)の違いについて解説しました。データフレームのカラムに文字列処理をする際にうまくいかなかったことはないですか?今回学んだ、str()とastype(str)の違いを知れば、もう迷わないですね。
コメント