python入門講座 | 変数の型変換を学ぼう(データ処理の基礎となる変数の型と変換)[第15回]

アラサーOLのためのpython入門講座
変数の型変換はPythonを使ったデータ処理やデータ分析で必要です!

Ciao!みなさんこんにちは!このブログでは主に
(1)pythonデータ解析,
(2)DTM音楽作成,
(3)お料理,
(4)博士転職
の4つのトピックについて発信しています。

今回は「アラサーOLのためのpython入門講座」です!この講座では、プログラミング初心者アラサーOLのMi坊さんに、pythonを学習する上でのアドバイスを行います!「パソコンもプログラミングも初心者だけど、プログラミングができるようになりたい!」という方のためにstep-by-stepで解説していきます。

今日はPythonの変数の型変換について解説します!Pythonの変数は型が一致していなくても、適切に変換することで演算を行うことができます。例えば、型変換によって文字列と数値を同時に扱うことができます。Pythonでデータ処理やデータ分析を行うと、入力データに数値や文字列が混在しているために型変換が必要となる場面がしばしば発生します。変数の型変換を習得することでPythonを使ったデータ処理・データ分析に一歩踏み出せます!
ぜひ最後までお付き合いください!

Kaiko
Kaiko

この記事はこんな人におすすめ

  • 初心者だけどpythonを始めた!
  • pythonの基本的な使い方を知りたい!
  • 独学で学んだpythonの知識を整理したい!

Abstract | 変数の型や型変換はデータ処理に必須の概念

変数の型や型の変換といった概念はPythonなどのプログラミングを駆使したデータ処理、データ分析に必須の概念です。データ分析では、数値、文字、画像、音声など様々な種類のデータを扱う可能性があります。基本的なものはcsvなどに表形式でまとめられた数値や文字のデータでしょう。そのような表形式のデータでは、ある列には整数値、ある列には浮動小数点の数値、ある列には文字列などと、変数の型で言えば、複数の種類が混在していることがしばしばです。型が異なる変数同士は基本的には演算ができないため、変数の型を変換してあげる必要があります。したがって、複数の変数の型が混在したデータを処理するときには変数の型の変換が必須の操作となります。

今回解説する型変換はデータ処理やデータ分析の基礎の基礎を押さえる位置づけです。前回の記事「python入門講座 | 変数の型を学ぼう(int/float/strなど)」で学んだように、Pythonにはint型、float型、str型という3つの代表的な変数の型があります。本格的にデータ分析を進めると、これらの変数を配列としてまとめたリスト型や辞書型、NumPyやpandasなどの外部ライブラリで定義されるnumpy配列やデータフレームといった応用型を扱うことになります。これらはint型、float型、str型の応用型なのでまずはこの3つの型と型変換を習得しましょう!



Method | 変数の型の変換方法

変数の型の変換では

  • int(var)
  • float(var)
  • str(var)

のように、変換先の型+丸括弧で変換したい変数を囲むという形で書きます。
int型、float型、str型それぞれへの変換の方法と例をご紹介します。

int型への変換

int型への変換はfloat型で計算された数値をリストや配列のインデックスにしたい場合などに使います。
リストや配列は別途扱いますが、たくさんの要素(数値)を格納できるタイプの変数です。
例えばリスト型なら

# define a list
var_list = [1,2,3,4]

# get 2nd value
print(var_list[1])  # 2

といった感じで変数の定義と呼び出しを行います。
変数を呼び出すときは「var_list[n]」のように四角カッコに呼び出したい要素の番号nを入力します。
この番号はインデックスと呼ばれ、整数値でなければなりません。
float型として途中計算をしてからインデックスとして使う場合にはint型への変換が必要です。

float型からint型へ

float型からint型への変換の例を取り上げます。
この変換は小数点以下を切り捨てる形で行われます。
まずは簡単に、

# define a float variable
var_float = 2.0

# print the variable casted to int
print(int(var_float))  # 2

と実行すると「2」と表示されます。

次に、小数点以下がゼロでない変数を変換してみると

# define a float variable
var_float = 2.7

# print the variable casted to int
print(int(var_float))  # 2

小数点以下は切り捨てられて「2」と表示されます。

切り捨てではなく四捨五入で変換したい場合

四捨五入で変換したい場合は、変換する前に0.5を足しておきます。

# define a float variable
var_float = 2.7

# print the variable rounded to nearest int
print(int(var_float+0.5))  # 3
リストのインデックスにする例

floatでの計算結果をリストのインデックスにする場合は

# define a list
var_list = [1,2,3,4,5]

# get an index at mid point
idx_half = len(var_list) / 2    # 5 / 2 = 2.5
print(idx_half) # 2.5

# print the list element at the index
print(var_list[int(idx_half)])    # 3

のようにします。「len()」はリストの要素数を返す関数なので「idx_half」には5 / 2 = 2.5というfloat型の結果が格納されています。
「var_list[int(idx_half)]」ように、最後にインデックスとして使うときにはint型に変換します。
もしも最後のところをint型に変換せずに

# print the list element at the index
print(var_list[idx_half])    # error

としてしまうと「TypeError」となります。

str型からint型への変換

str型の変数をint型に変換することも可能です。
str型の変数の中身は数値である必要があります。 
例えば

# define a numeric str variable
var_str = '5'
print(var_str)   # 5

# convert variable to int
print(int(var_str)+1)   # 6

のようにint(var_str)とint型に変換することで1を足すことができます。
もしも、

# print the variable + 1 without cast
print(var_str+1)   # error

としてしまうとエラーとなります。

str型変数の中身は整数値である必要がある

str型からint型への変換を行うためにはstr型の変数の中身は整数の値である必要があります。
例えば、下記のように小数点が付いているとエラーとなります。

# define a floating-point str variable
var_str = '5.1'
print(var_str)   # 5.1

# convert variable to int
print(int(var_str))   # error

この場合は、float型への変換を経由すると変換できます。

# convert the variable to int via float
print(int(float(var_str)))   # 5

これを実行すると「5」と表示されます。一度float()でfloat型に変換してからint()でint型に変換しています。

ちなみに、そもそもstr型変数の中身が数値でない場合もエラーになります。

# define a non-numeric str variable
var_str = 'abc'
print(var_str)   # abc

# convert variable to int
print(int(var_str))   # error

これを実行すると「ValueError」となります。



float型への変換

次にfloat型への変換です。float(hogehoge)とすることで変換できます。
ここではint型からの変換とstr型からの変換を見ていきます。

int型からfloat型への変換

int型からfloat型への変換は単純で、小数点以下に0が入る形で変換されます。

# define an int variable
var_int = 3
print(var_int)   # 3

# convert variable to int
print(float(var_int))   # 3.0

とすれば、1つ目のprint()では「3」が、2つ目のprint()では「3.0」が表示されます。

int型からfloat型への暗黙の型変換

int型からfloat型へは「暗黙の型変換」がしばしば行われます。
int型とfloat型はどちらも数値を扱う変数です。なので、int型変数とfloat型変数は明示的に型変換を行わなくても演算ができるようになっています。
int型変数とfloat型変数の演算を行うと、int型変数が自動的にfloat型に変換され、float型で演算が行われます。出力もfloat型となります。
例えば、

# define an int variable
var_int = 3
print(var_int)   # 3

# define a float variable
var_float = 2.
print(var_float)   # 2.0

# explicit casting
print(float(var_int) + var_float)   # 5.0

# implicit casting
print(var_int + var_float)   # 5.0

とすると、1つ目の「float(var_int) + var_float」ではvar_intを明示的にfloatに変換するので、3.0+2.0 = 5.0という答えが返ってきます。2つ目の「var_int + var_float」ではvar_intを型変換していませんが、ここでは暗黙の型変換が行われ、float型として計算されます。

このようにintとfloatの計算においてはint型がfloat型に暗黙のうちに型変換されるためエラーになることなく処理できます。

str型からfloat型への変換

str型からfloat型にも変換ができます。
str型変数の中身は、小数点つきの数値や小数点なしの数値、あるいは指数表記の数値である必要があります。
小数点つきの数値のstr型変数は下記のようにしてfloat型に変換できます。

# define a floating-point str variable
var_str = '3.2'
print(var_str)   # 3.2

# convert the variable to float
print(float(var_str) + 0.5)   # 3.7

小数点なしの数値、つまり整数値が格納されたstr型変数もfloat型に変換できます。

# define a numeric str variable
var_str = '3'
print(var_str)   # 3

# convert the variable to float
print(float(var_str))   # 3.0

指数表記でも構いません。

# define a str variable with the exponent style
var_str = '3.1e+02'
print(var_str)   # 3.1e+02

# convert the variable to float
print(float(var_str))   # 310.0

inf(無限大)やnan(not a number: 不正な数値)も変換可能です。

# define a str variable with inf
var_str = 'inf'
print(var_str)   # inf

# convert the variable to float
print(float(var_str))   # inf
# define a str variable with nan
var_str = 'nan'
print(var_str)   # nan

# convert the variable to float
print(float(var_str))   # nan

もちろん数値ではないものが格納されているstr型変数はfloat型には変換できません。

# define a str variable with string
var_str = 'abc'
print(var_str)   # abc

# convert the variable to float
print(float(var_str))   # error

上記を実行すると「ValueError」となります。



str型への変換

最後にstr型への変換です。str(hogehoge)とすることで変換できます。

int型からstr型への変換

int型からstr型への変換は何も考えずにstr(val_int)のようにすればOKです。

# define an int variable
var_int = 6
print(var_int)   # 6

# convert the variable to str
print(str(var_int))   # 6

これを「文字列の連結」と組み合わせて使うと、以下のように文字列と数値を結合することができます。

# concatinate with another str
val_str = 'str_'
print(val_str + str(var_int))   # str_6

これを実行すると「str_6」と表示されます。つまり’str_’という文字列と6という数値を、型変換を行うことで結合できます。

float型からstr型への変換

float型からstr型への変換もstr(val_float)のようにすればOKです。
以下のように、通常は入力した桁数が文字列として格納されます。

# define a float variable
var_float = 3.14
print(var_float)   # 3.14

# convert the variable to str
print(str(var_float))   # 3.14

とすると「3.14」という文字列に変換されます。

途中で計算が入るなどして、もっと大きな桁数となった場合、有効な全桁(floatの場合は最大17桁)が文字列に変換されます。

# define a float variable
var_float = 3.14159253589793238462643383279
print(var_float)   # 3.1415925358979324

# convert the variable to str
print(str(var_float))   # 3.1415925358979324

このように大きな桁の数字の場合は有効な全桁が文字列に変換され「3.1415925358979324」と表示されます。

発展編 | フォーマット指定子を用いたstr型への変換

桁数を制限したい場合には、「フォーマット指定子」というものを使います。
これについては別途詳しく解説するつもりです。ここではそういうものがあるのね、ぐらいに思っていていください。
例えば、小数点以下3桁までを文字列にしたい場合には以下のようにします。

# convert the variable to str
var_str = '%.3f' % (var_float)
print(var_str)   # 3.142

「%.3f」の部分がフォーマット指定子で「%f」「%g」「%e」「%s」など他にもいろいろなフォーマットがあり、桁数などを細かく指定することができます。
上記の例では「%f」という浮動小数点フォーマットを指定する様式に「.3」という小数点以下3桁の指定を加えることで小数点以下3桁までを文字列に変換することができます。
ちなみにこの変換を行うと、四捨五入が行われます。そのため、上の例では「3.141」ではなく「3.142」となります。



Result | 実際にやってみよう

実際に手を動かしてみましょう!
今回もJupyter Notebookでコーディングしましょう!
もしコーディングの方法がわからなければ練習問題の後に例を示すので、そちらを参照してください。

準備 | python notebookの新規作成

まずはpython notebookを用意しましょう。
いつものpython_practiceのディレクトリに「practice_variable_conversion」という名前のpython notebookを作成してください。
ターミナルを立ち上げて~/python_practiceに移動、jupyter notebookを起動し、ブラウザから新規→Python3でpython notebookを開いて、ファイル→リネームでファイル名を決定します。
もしやり方がわからなければ、前回記事「python入門講座 | 変数を使いこなそう1(変数の定義方法と基本ルール)」や過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」で詳しく解説しているので、これらを見ながらやってみてください。

int型変数への変換

まずはint型変数への変換をやってみましょう!
いつものように最初のセルをMarkdownセルにして

# int型変数への変換の例

と書いておきましょう。後で見返したときにわかりやすくなります。
Markdownセルやコードセルなどの用語やこれらの使い方は過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」を参照してください。
このあとも適宜Markdownセルを使って見出しや説明を書いていきましょう!

float型からint型への変換

float型からint型への変換です。
Markdownセルに説明を書いたら、次のコードセルで以下を実行し、float型変数をint型に変換しましょう。

# define a float variable
var_float = 2.0

# print the variable casted to int
print(int(var_float))  # 2

2が表示されます。

小数点以下切り捨ての確認

小数点以下がゼロでない場合、int型に変換すると切り捨てられることを確認しましょう。
以下を実行してみてください。

# define a float variable
var_float = 2.7

# print the variable casted to int
print(int(var_float))  # 2

これも切り捨てられて2が表示されます。

四捨五入の例

四捨五入も試してみましょう。0.5を足してから変換します。以下を実行してみてください。

# define a float variable
var_float = 2.7

# print the variable rounded to nearest int
print(int(var_float+0.5))  # 3

今度は3が表示されるはずです。以下の2.4の場合も試してみてください。2が表示されます。

# define a float variable
var_float = 2.4

# print the variable rounded to nearest int
print(int(var_float+0.5))  # 2
floatをintに変換してリストのインデックスに使う例

リスト型変数についての説明はまだしていませんが、やってみましょう。リスト型変数の要素を呼び出すために使うインデックスはint型である必要があります。以下を実行してみましょう。

# define a list
var_list = [1,2,3,4,5]

# get an index at mid point
idx_half = len(var_list) / 2    # 5 / 2 = 2.5
print(idx_half) # 2.5

# print the list element at the index
print(var_list[int(idx_half)])    # 3

2.5と3が表示されます。長さ5のリストの半分の位置にある2.5番目の要素を取得したいところですが、切り捨ててint型に変換し、2番目の要素の3を取り出しています。Pythonでは最初の要素が0番目であることに注意しましょう。

int型に変換しない場合、エラーとなることも確認してみましょう。以下を実行しましょう。

# print the list element at the index
print(var_list[idx_half])    # error

以下のエラーが表示されるはずです。

TypeError: list indices must be integers or slices, not float

str型からint型への変換

数値がstr型変数に数字として格納されていても四則演算はできませんが、int型に変換することでできるようになります。以下を実行してみましょう。

# define a numeric str variable
var_str = '5'
print(var_str)   # 5

# convert the vaiable to int
print(int(var_str)+1)   # 6

5+1で6が表示されます。

試しにint型に変換しないで足し算してみましょう。以下を実行します。

# print the variable + 1 without cast
print(var_str+1)   # error

以下のエラーが表示されます。「str型変数とint型変数は連結できない」というエラーです。ちなみにstr型変数同士は足し算することで連結することができます。これについては次回以降扱います。

TypeError: can only concatenate str (not "int") to str

str型変数の中身が整数値でない場合

str型変数の中身が整数値でなく、例えば小数点付きの数値の場合はint()でint型に変換することができません。以下を実行してみましょう。

# define a floating-point str variable
var_str = '5.1'
print(var_str)   # 5.1

# convert variable to int
print(int(var_str))   # error

以下のようなエラーが出ます。

ValueError: invalid literal for int() with base 10: '5.1'

このような場合は一度float型に変換してからint型に変換します。以下を実行してみましょう。

# convert the variable to int via float
print(int(float(var_str)))   # 5

そもそもstr型変数の中身が数字出ない場合はどうやってもエラーになります。これも以下を実行して確認してみましょう。

# define a non-numeric str variable
var_str = 'abc'
print(var_str)   # abc

# convert variable to int
print(int(var_str))   # error

以下のエラーが表示されます。

ValueError: invalid literal for int() with base 10: 'abc'



float型への変換

次にfloat型への変換をやってみましょう!

int型からfloat型への変換

まずはint型の変数をfloat型に変換してみましょう。以下を実行してください。

# define an int variable
var_int = 3
print(var_int)   # 3

# convert variable to int
print(float(var_int))   # 3.0

1つ目は整数値の3、2つめは浮動小数点の3.0が表示されます。

float型への暗黙の型変換

次にint型とfloat型の演算を行って、float型に暗黙の変換が行われることを確かめましょう。以下を実行してください。

# define an int variable
var_int = 3
print(var_int)   # 3

# define a float variable
var_float = 2.
print(var_float)   # 2.0

# explicit casting
print(float(var_int) + var_float)   # 5.0

# implicit casting
print(var_int + var_float)   # 5.0

「3, 1.0, 5.0, 5.0」と表示されます。1つ目の5.0はint型変数である「var_int」を明示的にfloat型変換に変換してから足し算をしているので結果もfloat型となります。
2つ目の5.0は、明示的な型変換を行っていませんが、float型変数である「var_float」との足し算なので「var_int」は自動的にfloat型に変換されてから計算されます。このため、結果はfloat型となります。

str型からfloat型への変換

str型変数からfloat型変数への変換をやってみましょう。まずは小数点付きの数字を変換してみましょう。以下を実行してください。

# define a floating-point str variable
var_str = '3.2'
print(var_str)   # 3.2

# convert the variable to float
print(float(var_str) + 0.5)   # 3.7

「3.2, 3.7」と表示されます。「var_str」に格納されている’3.2’という文字列が数値に変換されてから0.5足され、3.7となります。

小数点なしの数字が文字列として格納されていてもfloat型に変換することができます。以下を実行してみましょう。

# define a numeric str variable
var_str = '3'
print(var_str)   # 3

# convert the variable to float
print(float(var_str))   # 3.0

「3, 3.0」と表示されます。このように文字列が整数値であってもfloat型に変換することができます。

指数表記の文字列の変換も試してみましょう。310という値は数学での指数表記にすると\(3.1 \times 10^{2}\)、プログラミング言語での指数表記では「3.1e+2」となります。この表記で試してみましょう。以下を実行してください。

# define a str variable with the exponent style
var_str = '3.1e+02'
print(var_str)   # 3.1e+02

# convert the variable to float
print(float(var_str))   # 310.0

1つ目のprint()では「3.1e+02」、2つ目では「310.0」と表示されます。310のように桁数の大きくない数値をfloat型で表示する場合には大抵は指数表記とはならず「310.0」のような表記になります。桁数が大きな数値では自動的に指数表記になることがあります。

他にも無限大(inf)や不正な数値(nan)といった文字列もfloat型に変換できます。以下を実行してください。 

# define a str variable with inf
var_str = 'inf'
print(var_str)   # inf

# convert the variable to float
print(float(var_str))   # inf

どちらも「inf」と表示されますが、1つ目は文字列(inf型)、2つ目は数値(inf型)です。

さらに以下を実行して「nan」も試してみましょう。

# define a str variable with nan
var_str = 'nan'
print(var_str)   # nan

# convert the variable to float
print(float(var_str))   # nan

どちらも「nan」と表示されますが、1つ目は文字列(str型)、2つ目は数値(float型)です。

inf, nanといった特殊な場合を除いて、数字以外の文字列をfloat型に変換することはできません。以下を実行して確かめてみましょう。

# define a str variable with string
var_str = 'abc'
print(var_str)   # abc

# convert the variable to float
print(float(var_str))   # error

以下のようなエラーが表示されます。

ValueError: could not convert string to float: 'abc'



str型への変換

最後にstr型への変換をやってみましょう。以下を実行してみてください。

# define an int variable
var_int = 6
print(var_int)   # 6

# convert the variable to str
print(str(var_int))   # 6

6が2回表示されます。1回目はint型、2回目はstr型となっています。
これだけでだと何をやっているのかわかりにくいので、文字列の連結と組み合わせてみましょう。以下を実行して「str_」という文字列と「6」という数値を連結してみましょう。

# concatinate with another str
val_str = 'str_'
print(val_str + str(var_int))   # str_6

これで「str_6」と表示されます。
「var_int」をstr型に変換しておかないとエラーとなります。試しに以下を実行してみてください。

# concatinate with another str
val_str = 'str_'
print(val_str + var_int)   # error

以下のようなエラー(str型しか連結できない)となります。

TypeError: can only concatenate str (not "int") to str

float型からstr型への変換

float型からstr型への変換も試してみましょう。float型変数をstr型に変換するときには、float型変数として有効な桁までが文字列として格納されます。以下を実行してみましょう。

# define a float variable
var_float = 3.14
print(var_float)   # 3.14

# convert the variable to str
print(str(var_float))   # 3.14

最初に「var_float」を定義するときに3桁しか入力していないため、どちらも3.14と表示されます。

もっと大きな桁のfloat型変数では、有効な全桁(最大17桁)が文字列として格納されます。以下を実行してみましょう。

# define a float variable
var_float = 3.14159253589793238462643383279
print(var_float)   # 3.1415925358979324

# convert the variable to str
print(str(var_float))   # 3.1415925358979324

どちらも「3.1415925358979324」となります。「var_float」を定義したときには31桁で定義していますがfloat型変数の最大桁数が17桁なので、「3.1415925358979324」までしか表示されません。

桁数の大きな数値を指定した桁数で文字列に格納したい場合や表示したい場合にはフォーマット指定子を使います。詳しくは別途扱いますのでいまは真似してみてください。以下を実行してください。

# convert the variable to str
var_str = '%.3f' % (var_float)
print(var_str)   # 3.142

「%f」は小数点表記の指定、%とfの間の「.3」は小数点以下3桁という指定です。よって「3.142」と表示されます。最後の桁は四捨五入が入っています。



練習問題

最後に練習問題をやってみましょう!
以下の処理をするコードを書いてみてください。

  1. 変数 pi_float に3.141592を代入し、pi_floatをint型に変換して出力してください。
  2. 変数 e_float に2.718をfloat型として代入し、小数点第1位を四捨五入してint型で出力してください。
  3. 変数 avogadro_str に\(6.02 \times 10^{23}\)という数字をstr型として代入し、float型に変換して出力してください。

練習問題の回答例

できたら回答例を確認しましょう!下の画面をスクロールすると回答例が見られます!
今回の記事で出てきた他のコードも載っているので参考にしてください!

練習問題おつかれさまでした!
今日はここまでです。Python Notebookを終了しておきましょう。もしPython Notebookを終了方法がわからなければ過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」の「Python Notebookの起動・終了方法」の章を参照してください!



Conclusion | まとめ

最後までご覧いただきありがとうございました!
Pythonの変数の型変換について解説しました!

Pythonで個々の変数の型や型変換を特別意識する場面は少ないですが、もう少し学習が進んでくると、NumPyやpandasといったライブラリを使ってデータ処理やデータ分析をすることになります。NumPyの配列(変数がたくさん格納された変数)やpandasのデータフレーム(配列と似たようなもの)を扱うようになると、変数の型変換が必要になります。
今回は基礎知識として簡単な型変換を取り上げました。地味な内容だったとは思いますが、後々この理解が役に立ってきます!気長にPythonを習得していきましょう!

以上「python入門講座 | 変数の型変換を学ぼう(データ処理の基礎となる変数の型と変換)」でした!
またお会いしましょう!Ciao!



References | 参考

参考教科書

以下の教科書を参考にして進めています!より詳しく学びたい方は購入して読んでみてください!

コメント

タイトルとURLをコピーしました