Pythonのライブラリ「pandas」は、前回の記事で紹介したシリーズの他、データフレームというテーブル形式のデータ構造を持っている。

データフレームは、行と列で構成された二次元配列のような構成で、行と列それぞれにインデックスを持つ構造だ。

今回は、このデータフレームについて詳しく説明していこう。

データフレームの作り方

ここでは一般的なデータフレームの作成方法について二つ取り上げる。

NumPyの配列を使う方法

まずはNumPyの配列を使う方法を見ていこう。

pandas、NumPyの各種ライブラリをインポートして、配列dataを作成し、dataを元にデータフレームを作成する。

1
2
3
4
5
6
7
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形式のテーブルが表示される。

ディクショナリを使う方法

次にリストを値として持つディクショナリを使う方法を紹介する。

1
2
3
4
5
6
7
8
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引数を指定することでおこなうことができる。

1
df = pd.DataFrame(data, columns=['c', 'a', 'b'])

もし上記のcolumnsで指定した列にデータが存在しない場合、データフレーム作成時には欠損値が代入される。

1
df = pd.DataFrame(data, columns=['c', 'a', 'b', 'd'])

データフレームの参照方法

列の参照

データフレームの列の参照には二通りの方法がある。
ディクショナリのように[‘taro’]と角括弧で指定する方法と、ドットで属性値のように指定する方法だ。
どちらも同じ結果を得ることができる。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
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属性を使う。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
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

第一引数に行インデックスを、第二引数に列インデックスを指定することで、狙った要素を参照することができる。

データフレームの値を変更する

列の値は、別の値を代入することで変更することができる。

01
02
03
04
05
06
07
08
09
10
11
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

上記の例は変更を応用した、列の追加の例だ。
このように新規で任意の列を追加することもできる。

シリーズを列に代入する

以下のようにシリーズを列に代入することもできる。

01
02
03
04
05
06
07
08
09
10
11
12
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キーワードを使っておこなう。

削除の例を示す前に、データフレームに削除対象の列を追加することにする。

01
02
03
04
05
06
07
08
09
10
11
12
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を削除してみよう。

1
del df['max']

指定した列が削除されていることが分かる。

データフレームの転置

ディクショナリと同様、T属性を使うことでデータフレームの行列を転置することができる。

1
2
3
4
5
6
7
8
9
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