values属性の値はDataFrameオブジェクトに格納されているデータをNumPyの多次元配列として表現したものです。
df.values
# 出力結果:
#array([['kawasaki', 80, 88.8],
# ['isshiki', 40, 65.2],
# ['endo', 52, 78.5]], dtype=object)
NumPyの多次元配列には特定のデータ型の値しか格納できない点には注意してください。上の例では、DataFrameオブジェクトには文字列、整数値、浮動小数点数値が格納されていました。そのため、これら3種類のデータを格納できるよう、多次元配列のdtypeはobject型になっています。
もう1つ。pandasのドキュメント「pandas.DataFrame.values」ではvalues属性ではなく、to_numpyメソッドの使用が推奨されている点にも注意してください。
a = df.to_numpy()
a
# 出力結果:
#array([['kawasaki', 80, 88.8],
# ['isshiki', 40, 65.2],
# ['endo', 52, 78.5]], dtype=object)
二次元の配列(行列)は行と列を入れ替えることで、数学的な操作が簡単に行えるようになることがよくあります。pandasではT属性により、行と列を入れ替えた転置行列を取得できます。
print(df)
# 出力結果:
# name age weight
#a kawasaki 80 88.8
#b isshiki 40 65.2
#c endo 52 78.5
print(df.T)
# 出力結果:
# a b c
#name kawasaki isshiki endo
#age 80 40 52
#weight 88.8 65.2 78.5
同じことはtransposeメソッドでもできます(実際、T属性は内部でtransposeメソッドを呼び出しています)。
df.transpose()
# 出力結果:
# a b c
#name kawasaki isshiki endo
#age 80 40 52
#weight 88.8 65.2 78.5
ここまではDataFrameオブジェクト自体のさまざまな情報を得るための属性やメソッドを紹介してきましたが、軸ラベルやデータ型(dtype)などをまとめて取得するメソッドもあります。それがDataFrameオブジェクトのinfoメソッドです。
以下はinfoメソッドを呼び出して、各種情報を表示したところです。
df.info(verbose=True)
# 出力結果:
#<class 'pandas.core.frame.DataFrame'>
#Index: 3 entries, a to c
#Data columns (total 3 columns):
# # Column Non-Null Count Dtype
#--- ------ -------------- -----
# 0 name 3 non-null object
# 1 age 3 non-null int64
# 2 weight 3 non-null float64
#dtypes: float64(1), int64(1), object(1)
#memory usage: 204.0+ bytes
この例では変数dfがDataFrameオブジェクトであること、インデックスのラベルが'a'、'b'、’c’の3つであること、列ラベルが'name'、’age’、’weight’の3つであること、各列にNaN値が含まれていないこと、各列のデータ型、メモリ使用量などの情報が一気に得られていることが分かります。Jupyter Notebookのような対話的な環境でDataFrameオブジェクトの概要を手早く知るには便利なメソッドだといえるでしょう。
今回は最後にDataFrameオブジェクトやSeriesオブジェクトをNumPyの多次元配列(ndarray)に変換したり、それらの要素の型を別のデータ型にキャストしたり、Seriesオブジェクトをリストに変換したりするのに使えるメソッドを紹介します。
先ほども簡単に紹介しましたが、DataFrameオブジェクトはNumPyの多次元配列に変換できます(Seriesオブジェクトも同様)。これにはto_numpyメソッドを使います。
以下にこれまでに作成してきたDataFrameオブジェクトをNumPyの多次元配列に変換する例を示します。
tmp = df.to_numpy()
print(tmp)
# 出力結果:
#[['kawasaki' 80 88.8]
# ['isshiki' 40 65.2]
# ['endo' 52 78.5]]
print(tmp.dtype) # object
ここでは文字列を含むDataFrameオブジェクトをNumPyの多次元配列に変換しています。NumPyではもちろん、全ての要素の型は同一でなければならないので、dtypeは何でも格納可能なobject型になってしまいます。
'age'列と'weight'列だけであれば、以下のように浮動小数点数値を格納する多次元配列に変換できます。
tmp = df.loc[:, 'age':'weight'].to_numpy()
print(tmp)
# 出力結果:
#[[80. 88.8]
# [40. 65.2]
# [52. 78.5]]
print(tmp.dtype) # float64
このときには、dtypeはデフォルトで全てのデータ型を格納可能なもの(ここではfloat64)になります。ただし、次のようにdtypeパラメーターに変換先のデータ型を指定することで明示的にキャストされます(ここではdtypeパラメーターに文字列を渡していますがNumPyのdtypeを渡すことも可能です)。
tmp = df.loc[:, 'age':'weight'].to_numpy(dtype='int32')
print(tmp)
# 出力結果:
#[[80 88]
# [40 65]
# [52 78]]
print(tmp.dtype) # int32
ここでは「dtype='int32'」と指定しているので、浮動小数点数値が整数値にキャストされました。変換後のデータ型を明示する際には精度が落ちる可能性がある点には注意してください(上の例では'weight'列のデータは整数値にキャストされ、小数点以下の値が失われています)。
to_numpyメソッドにはcopyパラメーターがあります。デフォルト値はFalseですが、これはto_numpyメソッド呼び出し時にデータがコピーされないことを保証するものではありません(Falseを指定してもコピーされることがあります)。むしろ、「copy=True」を指定したときには確実にコピーされると考えた方がよいでしょう。
Seriesオブジェクトでもto_numpyメソッドは呼び出せます。以下に例だけ示します。
s = df['age']
tmp = s.to_numpy()
print(tmp) # [80 40 52]
astypeメソッドはDataFrameオブジェクトの各列のデータ型を一括して、または列ごとに特定のデータ型に変換するものです(astypeメソッドはSeriesオブジェクトでも使用できます)。以下に一括してデータ型を変換する例を示します(ここでは新たにDataFrameオブジェクトを生成しています)。
df = pd.DataFrame([{'col0': 0, 'col1': 1},
{'col0': 2, 'col1': 3},
{'col0': 4, 'col1': 5}], index=['row0', 'row1', 'row2'])
print(df)
# 出力結果:
# col0 col1
#row0 0 1
#row1 2 3
#row2 4 5
df2 = df.astype('float64')
print(df2)
# 出力結果:
# col0 col1
#row0 0.0 1.0
#row1 2.0 3.0
#row2 4.0 5.0
astypeメソッドにデータ型を1つだけ渡せば、その全ての要素のデータ型が一括で変換されます。
列ごとにデータ型を指定することも可能です。
df2 = df.astype({'col1': 'float64'})
print(df2)
# 出力結果:
# col0 col1
#row0 0 1.0
#row1 2 3.0
#row2 4 5.0
特定の列のデータ型だけを変換するには、辞書を使って「{列ラベル0: データ型0, 列ラベル1: データ型1, ……}」のような形で変換先のデータ型を指定します。上の例では 'col1'列のデータ型だけを'float64'型に変換するように指定している点に注目してください。
最後にSeriesオブジェクトで使用可能なto_listメソッドも紹介しておきましょう(DataFrameオブジェクトでは使用できません)。これはSeriesオブジェクトをPythonのリストに変換します。以下に例を示します。
l = df['col1'].to_list()
print(l) #
DataFrameオブジェクトをリストのリストに変換するのであれば、例えば以下のようなコードが考えられます。
result = [df.loc[i].to_list() for i in df.index]
print(result) # [[0, 1], [2, 3], [4, 5]]
しかし、恐らくは以下のコードの方が高速です。
tmp = df.to_numpy() # tmp = df.values
result = tmp.tolist()
print(result) # [[0, 1], [2, 3], [4, 5]]
今回はDataFrameオブジェクトそのものの各種情報を知るために使える属性やメソッドと、DataFrameオブジェクトまたはSeriesオブジェクトを別のオブジェクトに変換するために使えるメソッドを紹介しました。しかし、DataFrameオブジェクト(とSeriesオブジェクト)の便利な機能の紹介が終わったわけではありません。次回もまたこれらのオブジェクトが持つさまざまな機能について見ていくことにしましょう。
Copyright© Digital Advantage Corp. All Rights Reserved.