Pandas データフレーム

Python で行列データを取り扱うときは Pandas モジュールのデータフレーム型を利用すると便利である。各行ごとの平均や列名で列を抽出したりすることが簡単に行えるようになる。

Pandas データフレームの作成

Pandas データフレームは DataFrame で生成する。データフレームを生成するときに、データフレームの列名もつけることができる。

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

行名や列名を確認するには indexcolumns メソッドを利用する。

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)

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

データの読み込み

テキストファイルからデータを読み込むには read_csv メソッドを利用する。例えば、このサンプルデータを読み込むには次のようにする。このサンプルデータは、最初の数行は # から開始しているコメント行で、データではない。そのため、read_csvcomment='#' 引数でコメント行を読み飛ばすように指定する。

import pandas as pd

data = pd.read_csv("https://stats.biopapyrus.jp/data/sleep_in_mammals.txt", sep = "\t", comment = "#")
data.head()
##                   Species    BodyWt  BrainWt  NonDreaming  Dreaming  \
## 0         Africanelephant  6654.000   5712.0          NaN       NaN
## 1  Africangiantpouchedrat     1.000      6.6          6.3       2.0
## 2               ArcticFox     3.385     44.5          NaN       NaN
## 3    Arcticgroundsquirrel     0.920      5.7          NaN       NaN
## 4           Asianelephant  2547.000   4603.0          2.1       1.8
## 
##    TotalSleep  LifeSpan  Gestation  Predation  Exposure  Danger
## 0         3.3      38.6      645.0          3         5       3
## 1         8.3       4.5       42.0          3         1       3
## 2        12.5      14.0       60.0          1         1       1
## 3        16.5       NaN       25.0          5         2       3
## 4         3.9      69.0      624.0          3         5       4

データが保存されているテキストファイルに、データのヘッダー(列名)がついていない場合は、header = -1 を指定する。

import pandas as pd

data = pd.read_csv("no_header_data.tsv", sep = "\t", header = -1)

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

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

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

行の抽出

データフレームから行を抽出するとき、iloc メソッドを利用すると添字で抽出できるようになる。

import pandas as pd

data = pd.read_csv("https://stats.biopapyrus.jp/data/sleep_in_mammals.txt", sep = "\t", comment = "#")

data.iloc[0:4, :]
##                   Species    BodyWt  BrainWt  NonDreaming  Dreaming  \
## 0         Africanelephant  6654.000   5712.0          NaN       NaN
## 1  Africangiantpouchedrat     1.000      6.6          6.3       2.0
## 2               ArcticFox     3.385     44.5          NaN       NaN
## 3    Arcticgroundsquirrel     0.920      5.7          NaN       NaN
## 
##    TotalSleep  LifeSpan  Gestation  Predation  Exposure  Danger
## 0         3.3      38.6      645.0          3         5       3
## 1         8.3       4.5       42.0          3         1       3
## 2        12.5      14.0       60.0          1         1       1
## 3        16.5       NaN       25.0          5         2       3

data.iloc[[2, 4, 6], :]
##          Species    BodyWt  BrainWt  NonDreaming  Dreaming  TotalSleep  \
## 2      ArcticFox     3.385     44.5          NaN       NaN        12.5
## 4  Asianelephant  2547.000   4603.0          2.1       1.8         3.9
## 6    Bigbrownbat     0.023      0.3         15.8       3.9        19.7
## 
##    LifeSpan  Gestation  Predation  Exposure  Danger
## 2      14.0       60.0          1         1       1
## 4      69.0      624.0          3         5       4
## 6      19.0       35.0          1         1       1

条件を指定して、その条件を満たす行だけを取得することもできる。例えば、BodyWt 列が 1000 以上の行を取得するには、次のようにする。

data[data.BodyWt < 1000]
##            Species  BodyWt  BrainWt  NonDreaming  Dreaming  TotalSleep  \
## 0  Africanelephant  6654.0   5712.0          NaN       NaN         3.3
## 4    Asianelephant  2547.0   4603.0          2.1       1.8         3.9
## 
##    LifeSpan  Gestation  Predation  Exposure  Danger
## 0      38.6      645.0          3         5       3
## 4      69.0      624.0          3         5       4

列の抽出

Pandas データフレームの列の抽出は、行の抽出と同様に行える。例えば、iloc を利用して添字で列を取得するには、次のようにする。

import pandas as pd
data = pd.read_csv("https://stats.biopapyrus.jp/data/sleep_in_mammals.txt", sep = "\t", comment = "#")

data.iloc[:, 0:3].head()
##                   Species    BodyWt  BrainWt
## 0         Africanelephant  6654.000   5712.0
## 1  Africangiantpouchedrat     1.000      6.6
## 2               ArcticFox     3.385     44.5
## 3    Arcticgroundsquirrel     0.920      5.7
## 4           Asianelephant  2547.000   4603.0

データフレームに列名が付いている場合は、列名で列を取得することもできる。

data.columns
## Index(['Species', 'BodyWt', 'BrainWt', 'NonDreaming', 'Dreaming', 'TotalSleep',
##        'LifeSpan', 'Gestation', 'Predation', 'Exposure', 'Danger'],
##       dtype='object')

col = ["Species", "LifeSpan", "TotalSleep"]
data[col].head()
##                   Species  LifeSpan  TotalSleep
## 0         Africanelephant      38.6         3.3
## 1  Africangiantpouchedrat       4.5         8.3
## 2               ArcticFox      14.0        12.5
## 3    Arcticgroundsquirrel       NaN        16.5
## 4           Asianelephant      69.0         3.9

データフレームから 1 列だけを取得するなら、次のようにして取得することもできる。

data.TotalSleep.head()
## 0     3.3
## 1     8.3
## 2    12.5
## 3    16.5
## 4     3.9
## Name: TotalSleep, dtype: float64

Pandas データフレームクラスのメソッド

Pandas データフレーム型には、合計値や平均値などを求めるメソッドが用意されている。値を計算する際に、縦方向かあるいは横方向かを axis で指定できる。axis = 0 はデータフレームの縦方向に対して計算を行い、axis = 1 はデータフレームの縦方向に対して計算を行う。

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.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