Pandas データフレーム

Python を利用してデータを解析するうえで、データを配列型(行列型)またはデータフレーム型として扱う。配列型または行列型は NumPy モジュールを利用すると扱えるようになる。データフレーム型は pandas モジュールを利用する。配列型・行列型に比べデータフレーム型の方が機能的に多い。

  1. データの読み込み
  2. データの書き込み(保存)
  3. 行の抽出
  4. 列の抽出
  5. データフレーム作成
  6. データフレーム型のメソッド

データの読み込み

pandas を利用して行列型のサンプルデータを読む。データの読み込みは read_csv メソッドを利用する。この際に、ファイルの 1 行目がヘッダー行として処理される。ファイルにヘッダー行がない場合は header = -1 をつける。

import pandas as pd

data = pd.read_csv("http://stat.biopapyrus.net/data/rat.food.txt", sep = "\t")
data.head()
##   type  Day0  Day1  Day2  Day3  Day4  Day5  Day6  Day7
## 0   PF   200   203   195   192   187   185   184   178
## 1   PF   200   187   175   165   183   178   176   172
## 2   PF   208   197   209   199   198   190   186   185
## 3   PF   208   194   202   197   194   192   192   187
## 4   PF   212   200   210   199   188   192   188   185


data = pd.read_csv("http://stat.biopapyrus.net/data/rat.food.txt", sep = "\t", header = -1)
data.head()
##       0     1     2     3     4     5     6     7     8
## 0  type  Day0  Day1  Day2  Day3  Day4  Day5  Day6  Day7
## 1    PF   200   203   195   192   187   185   184   178
## 2    PF   200   187   175   165   183   178   176   172
## 3    PF   208   197   209   199   198   190   186   185
## 4    PF   208   194   202   197   194   192   192   187

データの書き出し(保存)

データの書き出しは to_csv メソッドを利用する。その際に sep 引数で区切り文字を指定する。省略した場合は、データはカンマ区切りの CSV ファイルとして保存される。

data.to_csv("data.txt", sep = "\t")

行の抽出

Pandas を利用して読み込んだデータに対して行または列を抽出する方法。ブーリアンベクトルで取得する方法。

row_keep = [True, False, True, False, False, False, False, True,
            True, False, False, False, False, False, True]
data[row_keep]
##    type  Day0  Day1  Day2  Day3  Day4  Day5  Day6  Day7
## 0    PF   200   203   195   192   187   185   184   178
## 2    PF   208   197   209   199   198   190   186   185
## 7     C   208   203   217   231   242   248   257   260
## 8     C   210   214   227   235   251   252   263   290
## 14    G   206   208   209   211   211   211   215   214

Day0 が 200 未満の行を取得する。

data[data.Day0 < 200]
##    type  Day0  Day1  Day2  Day3  Day4  Day5  Day6  Day7
## 5     C   192   211   223   232   243   248   258   266
## 10    G   198   192   197   202   200   202   208   208
## 11    G   199   194   203   197   205   198   204   213

iloc メソッドを利用した行の取得方法。

data.iloc[0:4, :]
##   type  Day0  Day1  Day2  Day3  Day4  Day5  Day6  Day7
## 0   PF   200   203   195   192   187   185   184   178
## 1   PF   200   187   175   165   183   178   176   172
## 2   PF   208   197   209   199   198   190   186   185
## 3   PF   208   194   202   197   194   192   192   187

data.iloc[[2, 4, 6], :]
##   type  Day0  Day1  Day2  Day3  Day4  Day5  Day6  Day7
## 2   PF   208   197   209   199   198   190   186   185
## 4   PF   212   200   210   199   188   192   188   185
## 6    C   208   218   229   235   246   257   265   273

列の抽出

列の抽出は列名あるいは列の番号を指定して行う。


data[["type", "Day0", "Day1"]].head()
##   type  Day0  Day1
## 0   PF   200   203
## 1   PF   200   187
## 2   PF   208   197
## 3   PF   208   194
## 4   PF   212   200

data[[0, 1, 3, 5]].head()
##   type  Day0  Day2  Day4
## 0   PF   200   195   187
## 1   PF   200   175   183
## 2   PF   208   209   198
## 3   PF   208   202   194
## 4   PF   212   210   188

. を利用しても列のデータを取得できる。

data.type
## 0     PF
## 1     PF
## 2     PF
## 3     PF
## 4     PF
## 5      C
## 6      C
## 7      C
## 8      C
## 9      C
## 10     G
## 11     G
## 12     G
## 13     G
## 14     G
## Name: type, dtype: object

iloc メソッドを利用した列の取得方法。

data.iloc[:, 0:4]
##    type  Day0  Day1  Day2
## 0    PF   200   203   195
## 1    PF   200   187   175
## 2    PF   208   197   209
## 3    PF   208   194   202
## 4    PF   212   200   210
## 5     C   192   211   223
## 6     C   208   218   229
## 7     C   208   203   217
## 8     C   210   214   227
## 9     C   211   222   233
## 10    G   198   192   197
## 11    G   199   194   203
## 12    G   201   206   206
## 13    G   210   197   217
## 14    G   206   208   209

data.iloc[[2, 4, 6], [0, 1, 3]]
##   type  Day0  Day2
## 2   PF   208   209
## 4   PF   212   210
## 6    C   208   229

データの読み込み

配列からデータフレームを生成する例。

df = pd.DataFrame({'A': [1.0, 1.2, 3.4, 4.1, 8.2],
                   'B': [0.8, 1.4, 3.2, 4.3, 7.9],
                   'C': [1.3, 1.4, 2.9, 3.8, 9.4]})
df
##      A    B    C
## 0  1.0  0.8  1.3
## 1  1.2  1.4  1.4
## 2  3.4  3.2  2.9
## 3  4.1  4.3  3.8
## 4  8.2  7.9  9.4

Pandas データフレームの行名と列名を変更する際に set_values, columns などのメソッドを利用する。

df.columns = ['a', 'b', 'c']
df.set_index([['d1', 'd2', 'd3', 'd4', 'd5']])
df
##       a    b    c
## d1  1.0  0.8  1.3
## d2  1.2  1.4  1.4
## d3  3.4  3.2  2.9
## d4  4.1  4.3  3.8
## d5  8.2  7.9  9.4

メソッド

Pandas データフレーム型で利用出来るメソッドなど。

df = pd.DataFrame({'A': [1.0, 1.2, 3.4, 4.1, 8.2],
                   'B': [0.8, 1.4, 3.2, 4.3, 7.9],
                   'C': [1.3, 1.4, 2.9, 3.8, 9.4]},
                   index = ['d1', 'd2', 'd3', 'd4', 'd5'])

df
##       A    B    C
## d1  1.0  0.8  1.3
## d2  1.2  1.4  1.4
## d3  3.4  3.2  2.9
## d4  4.1  4.3  3.8
## d5  8.2  7.9  9.4

df.index
## Index([u'd1', u'd2', u'd3', u'd4', u'd5'], dtype='object')

df.index.values
## array(['d1', 'd2', 'd3', 'd4', 'd5'], dtype=object)

df.columns
## Index([u'A', u'B', u'C'], dtype='object')

df.columns.values
## array(['A', 'B', 'C'], dtype=object)

データフレームに対して平均や合計などを求める際に mean, sum などのメソッドを利用する。この際に axis に計算する方向を指定する。

df.mean(axis = 0)
## A    3.58
## B    3.52
## C    3.76
## dtype: float64

df.sum(axis = 1)
## d1     3.1
## d2     4.0
## d3     9.5
## d4    12.2
## d5    25.5
## dtype: float64

データフレームから特定の行または列を取り出す方法。iloc メソッドを利用すると便利。

df.A
## d1    1.0
## d2    1.2
## d3    3.4
## d4    4.1
## d5    8.2
## Name: A, dtype: float64

df['A']
## d1    1.0
## d2    1.2
## d3    3.4
## d4    4.1
## d5    8.2
## Name: A, dtype: float64

df[[0, 2]]
##       A    C
## d1  1.0  1.3
## d2  1.2  1.4
## d3  3.4  2.9
## d4  4.1  3.8
## d5  8.2  9.4

df.iloc[1:4,:]
##       A    B    C
## d2  1.2  1.4  1.4
## d3  3.4  3.2  2.9
## d4  4.1  4.3  3.8

df.iloc[3:,0:2]
##       A    B
## d4  4.1  4.3
## d5  8.2  7.9

keep = [True, False, True, True, False]
df[keep]
##       A    B    C
## d1  1.0  0.8  1.3
## d3  3.4  3.2  2.9
## d4  4.1  4.3  3.8