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