検索
連載

[pandas超入門]DataFrameの情報(形状、要素数、要素のデータ型など)を調べてみようPythonデータ処理入門(2/2 ページ)

DataFrameオブジェクトにはたくさんの属性やメソッドがあります。その中から今回はDataFrameオブジェクト自体に関する情報を調べたり、これを他のオブジェクトに変換したりするのに使えるものを紹介します。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

values属性

 values属性の値はDataFrameオブジェクトに格納されているデータをNumPyの多次元配列として表現したものです。

df.values
# 出力結果:
#array([['kawasaki', 80, 88.8],
#       ['isshiki', 40, 65.2],
#       ['endo', 52, 78.5]], dtype=object)

values属性はDataFrameオブジェクトに格納されているデータのNumPy表現を返す

 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)

to_numpyメソッド

T属性

 二次元の配列(行列)は行と列を入れ替えることで、数学的な操作が簡単に行えるようになることがよくあります。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

T属性を使って転置行列を取得

 同じことはtransposeメソッドでもできます(実際、T属性は内部でtransposeメソッドを呼び出しています)。

df.transpose()
# 出力結果:
#               a        b     c
#name    kawasaki  isshiki  endo
#age           80       40    52
#weight      88.8     65.2  78.5

transposeメソッドでも転置行列が得られる

infoメソッド

 ここまでは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

infoメソッドの実行例

 この例では変数dfがDataFrameオブジェクトであること、インデックスのラベルが'a'、'b'、’c’の3つであること、列ラベルが'name'、’age’、’weight’の3つであること、各列にNaN値が含まれていないこと、各列のデータ型、メモリ使用量などの情報が一気に得られていることが分かります。Jupyter Notebookのような対話的な環境でDataFrameオブジェクトの概要を手早く知るには便利なメソッドだといえるでしょう。

DataFrameオブジェクトを他のオブジェクトに変換する

 今回は最後にDataFrameオブジェクトやSeriesオブジェクトをNumPyの多次元配列(ndarray)に変換したり、それらの要素の型を別のデータ型にキャストしたり、Seriesオブジェクトをリストに変換したりするのに使えるメソッドを紹介します。

to_numpyメソッド

 先ほども簡単に紹介しましたが、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の多次元配列へ変換

 ここでは文字列を含む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

64bit浮動小数点数値を格納する多次元配列に変換

 このときには、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とする多次元配列に変換

 ここでは「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]

SeriesオブジェクトをNumPyの多次元配列(一次元配列)に変換

astypeメソッド

 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

DataFrameオブジェクトの全要素のデータ型を一括で変換

 astypeメソッドにデータ型を1つだけ渡せば、その全ての要素のデータ型が一括で変換されます。

 列ごとにデータ型を指定することも可能です。

df2 = df.astype({'col1': 'float64'})
print(df2)
# 出力結果:
#      col0  col1
#row0     0   1.0
#row1     2   3.0
#row2     4   5.0

'col1'列のデータ型だけをfloat64型に変換

 特定の列のデータ型だけを変換するには、辞書を使って「{列ラベル0: データ型0, 列ラベル1: データ型1, ……}」のような形で変換先のデータ型を指定します。上の例では 'col1'列のデータ型だけを'float64'型に変換するように指定している点に注目してください。

to_listメソッド(Seriesオブジェクト)

 最後にSeriesオブジェクトで使用可能なto_listメソッドも紹介しておきましょう(DataFrameオブジェクトでは使用できません)。これはSeriesオブジェクトをPythonのリストに変換します。以下に例を示します。

l = df['col1'].to_list()
print(l)  #

Seriesオブジェクトをリストに変換

 DataFrameオブジェクトをリストのリストに変換するのであれば、例えば以下のようなコードが考えられます。

result = [df.loc[i].to_list() for i in df.index]
print(result)  # [[0, 1], [2, 3], [4, 5]]

リスト内包表記を使ってDataFrameオブジェクトをリストのリストに変換

 しかし、恐らくは以下のコードの方が高速です。

tmp = df.to_numpy()  # tmp = df.values
result = tmp.tolist()
print(result)  # [[0, 1], [2, 3], [4, 5]]

DataFrameオブジェクトをto_numpyメソッドで多次元配列に変換してからそのtolistメソッドを使用してリストのリストに変換


 今回はDataFrameオブジェクトそのものの各種情報を知るために使える属性やメソッドと、DataFrameオブジェクトまたはSeriesオブジェクトを別のオブジェクトに変換するために使えるメソッドを紹介しました。しかし、DataFrameオブジェクト(とSeriesオブジェクト)の便利な機能の紹介が終わったわけではありません。次回もまたこれらのオブジェクトが持つさまざまな機能について見ていくことにしましょう。

「Pythonデータ処理入門」のインデックス

Pythonデータ処理入門

前のページへ |       

Copyright© Digital Advantage Corp. All Rights Reserved.

ページトップに戻る