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
行名や列名を確認するには index
と columns
メソッドを利用する。
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_csv
に comment='#'
引数でコメント行を読み飛ばすように指定する。
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