Pythonのライブラリ「pandas」は、前回の記事で紹介したシリーズの他、データフレームというテーブル形式のデータ構造を持っている。
データフレームは、行と列で構成された二次元配列のような構成で、行と列それぞれにインデックスを持つ構造だ。
今回は、このデータフレームについて詳しく説明していこう。
コンテンツ
データフレームの作り方
ここでは一般的なデータフレームの作成方法について二つ取り上げる。
NumPyの配列を使う方法
まずはNumPyの配列を使う方法を見ていこう。
pandas、NumPyの各種ライブラリをインポートして、配列dataを作成し、dataを元にデータフレームを作成する。
import pandas as pd
from pandas import DataFrame
import numpy as np
data = np.arange(15).reshape(3, 5)
df = pd.DataFrame(data)
df
Jupyter Notebookで作成したdfを見ると、次のとおりHTML形式のテーブルが表示される。
ディクショナリを使う方法
次にリストを値として持つディクショナリを使う方法を紹介する。
import pandas as pd
from pandas import DataFrame
data = {'a': [0, 1, 2],
'b': [3, 4, 5],
'c': [6, 7, 8]}
df = pd.DataFrame(data)
df
Python標準のディクショナリをDataFrameの引数に与えることで、先ほどの例と同様、データフレームを作成することができる。
列の並び替えは、データフレーム作成時にcolumns引数を指定することでおこなうことができる。
df = pd.DataFrame(data, columns=['c', 'a', 'b'])
もし上記のcolumnsで指定した列にデータが存在しない場合、データフレーム作成時には欠損値が代入される。
df = pd.DataFrame(data, columns=['c', 'a', 'b', 'd'])
データフレームの参照方法
列の参照
データフレームの列の参照には二通りの方法がある。
ディクショナリのように[‘taro’]と角括弧で指定する方法と、ドットで属性値のように指定する方法だ。
どちらも同じ結果を得ることができる。
import pandas as pd
from pandas import DataFrame
data = {'taro': [98, 82, 58],
'jiro': [79, 90, 91],
'saburo': [67, 79, 85]}
df = pd.DataFrame(data)
print(df)
# taro jiro saburo
# 0 98 79 67
# 1 82 90 79
# 2 58 91 85
# 下記二つは同じ結果が得られる
df.taro
df['taro']
# 0 98
# 1 82
# 2 58
# Name: taro, dtype: int64
行の参照
行の参照をおこなう場合、loc属性を使う。
import pandas as pd
from pandas import DataFrame
data = {'taro': [98, 82, 58],
'jiro': [79, 90, 91],
'saburo': [67, 79, 85]}
df = pd.DataFrame(data)
print(df)
# taro jiro saburo
# 0 98 79 67
# 1 82 90 79
# 2 58 91 85
df.loc[0]
# taro 98
# jiro 79
# saburo 67
# Name: 0, dtype: int64
df.loc[0, 'jiro'] # 79
第一引数に行インデックスを、第二引数に列インデックスを指定することで、狙った要素を参照することができる。
データフレームの値を変更する
列の値は、別の値を代入することで変更することができる。
import pandas as pd
from pandas import DataFrame
data = {'taro': [98, 82, 58],
'jiro': [79, 90, 91],
'saburo': [67, 79, 85]}
df = pd.DataFrame(data)
df['shiro'] = 80
df
上記の例は変更を応用した、列の追加の例だ。
このように新規で任意の列を追加することもできる。
シリーズを列に代入する
以下のようにシリーズを列に代入することもできる。
import pandas as pd
from pandas import DataFrame, Series
data = {'taro': [98, 82, 58],
'jiro': [79, 90, 91],
'saburo': [67, 79, 85]}
val = pd.Series([100, 100, 100])
df = pd.DataFrame(data)
df['shiro'] = val
df
データフレームの列を削除する
列の削除はdelキーワードを使っておこなう。
削除の例を示す前に、データフレームに削除対象の列を追加することにする。
import pandas as pd
from pandas import DataFrame
data = {'taro': [98, 82, 58],
'jiro': [79, 90, 91],
'saburo': [67, 79, 85]}
df = pd.DataFrame(data)
df['max'] = df.max(axis=1)
df['high'] = df['max'] >= 95
df
max関数で各行の最大値を列maxに代入し、最大値が95以上の行には列highにTrueを代入した。
追加した列maxを削除してみよう。
del df['max']
指定した列が削除されていることが分かる。
データフレームの転置
ディクショナリと同様、T属性を使うことでデータフレームの行列を転置することができる。
import pandas as pd
from pandas import DataFrame
data = {'taro': [98, 82, 58],
'jiro': [79, 90, 91],
'saburo': [67, 79, 85]}
df = pd.DataFrame(data)
df.T