Pandas はデータの処理およびデータの視覚化を行うための Python モジュールである。Pandas では、データを Series (ベクトル)または DataFrame (データフレーム、行列)として扱う。Pandas は NumPy よりも使いやすく、機能が豊富で、フォーマンスも優れている。
Pandas Series
Pandas の Series 型のオブジェクトは、Python のリスト型のオブジェクトに似ている。Pandas の Series 型と Python のリスト型は交互変換が可能で、その扱い方も似ている。Series 型は主に、ベクトルなどのような 1 次元データを保存するときに利用する。
import pandas as pd
x = pd.Series([1, 1, 2, 3, 5, 8, 13, 21, 34])
x
## 0 1
## 1 1
## 2 2
## 3 3
## 4 5
## 5 8
## 6 13
## 7 21
## 8 34
## dtype: int64
x[0]
## 1
x[3:6]
## 3 3
## 4 5
## 5 8
## dtype: int64
Series 型の各要素に名前をつけることができる。名前が付けられた要素は、添え字の他に名前でも読み出せる。Python でいうディクショナリに似ている。
import pandas as pd
y = pd.Series({'e': 2.72, 'pi': 3.14, 'g': 9.81})
y
## e 2.72
## g 9.81
## pi 3.14
## dtype: float64
y['e']
## 2.7200000000000002
y.index.values.tolist()
## ['e', 'g', 'pi']
Series 型のデータを作成してから名前を付けたり、あるいは既存の名前を変更したりする場合は index
メソッドを利用して名前を更新する。
import pandas as pd
y = pd.Series({'e': 2.72, 'pi': 3.14, 'g': 9.81})
y.index = ['napiers_constant', 'pi', 'gravitational_acceleration']
y
## napiers_constant 2.72
## pi 9.81
## gravitational_acceleration 3.14
## dtype: float64
Pandas DataFrame
Pandas の DataFrame 型は 2 次元データを扱うための型である。行はデータの要素(各サンプル)を表し、列はデータの属性(各サンプルの特徴量)を表す。行列のように利用できるが、列ごとに束ねて解析を進めるという概念を持つデータ型である。
DataFrame 型のデータは、複数の Series 型のオブジェクトを束ねて DataFrame 型にする。2 次元リストを作ってから DataFrame 型に変換するという方法もあるが、変換する際に行と列がよく混乱してしまうことがあるので、オススメしない。
import pandas as pd
s_gene = pd.Series(["gene_1", "gene_2", "gene_3", "gene_4"])
s_updown = pd.Series(["up", "up", "down", "down"])
s_fc = pd.Series([2.1, 4.5, -2.3, -3.1])
x = pd.DataFrame({'gene': s_gene, 'updown' : s_updown, 'foldchange' : s_fc})
x
## foldchange gene updown
## 0 2.1 gene_1 up
## 1 4.5 gene_2 up
## 2 -2.3 gene_3 down
## 3 -3.1 gene_4 down
DataFrame の列また行の名前を変更するときは、index
または columns
を通して行う。
import pandas as pd
s_gene = pd.Series(["gene_1", "gene_2", "gene_3", "gene_4"])
s_updown = pd.Series(["up", "up", "down", "down"])
s_fc = pd.Series([2.1, 4.5, -2.3, -3.1])
x = pd.DataFrame({'a': s_gene, 'b': s_updown, 'c': s_fc})
x.columns = ['gene', 'updown', 'foldchange']
x.index = ['ers1', 'ein4', 'ein3', 'rap2.16']
x
## gene updown foldchange
## ers1 gene_1 up 2.1
## ein4 gene_2 up 4.5
## ein3 gene_3 down -2.3
## rap2.16 gene_4 down -3.1
list(x.index)
## ['ers1', 'ein4', 'ein3', 'rap2.16']
list(x.columns)
## ['gene', 'updown', 'foldchange']
データフレームからデータを取り出すとき、iloc
または ix
メソッドを利用する。添え字を指定してデータを取り出す場合は iloc
メソッドを利用する。また、行名または列名を指定してデータを取り出す場合は ix
メソッドを利用する。
import pandas as pd
s_gene = pd.Series(["gene_1", "gene_2", "gene_3", "gene_4"])
s_updown = pd.Series(["up", "up", "down", "down"])
s_fc = pd.Series([2.1, 4.5, -2.3, -3.1])
x = pd.DataFrame({'a': s_gene, 'b': s_updown, 'c': s_fc})
x.columns = ['gene', 'updown', 'foldchange']
x.index = ['ers1', 'ein4', 'ein3', 'rap2.16']
x.iloc[:, 0:2]
## gene updown
## ers1 gene_1 up
## ein4 gene_2 up
## ein3 gene_3 down
## rap2.16 gene_4 down
x.iloc[1:3, :]
## gene updown foldchange
## ein4 gene_2 up 4.5
## ein3 gene_3 down -2.3
x.iloc[[0, 2, 3], [0, 2]]
## gene foldchange
## ers1 gene_1 2.1
## ein3 gene_3 -2.3
## rap2.16 gene_4 -3.1
x.ix[:, ['gene', 'foldchange']]
## gene foldchange
## ers1 gene_1 2.1
## ein4 gene_2 4.5
## ein3 gene_3 -2.3
## rap2.16 gene_4 -3.1
x.ix[['ers1', 'rap2.16'], ['gene', 'foldchange']]
## gene foldchange
## ers1 gene_1 2.1
## rap2.16 gene_4 -3.1
また、条件を指定して、条件を満たした行だけを取り出すといった操作もできる。例えば、updown 列で up を含む行だけを取り出す場合は次のようにする。
x.ix[x.ix[:, 'updown'] == 'up', ]
## gene updown foldchange
## ers1 gene_1 up 2.1
## ein4 gene_2 up 4.5
ファイルの読み書き
ファイルの読み込み
Pandas モジュールの read_csv
メソッドを利用してデータを読み込む。header
オプションを省略した場合は、ファイルの 1 行目がヘッダー行として処理される(header = 0
と同じ)。また、ヘッダー行がない場合は header = -1
と指定する。
import pandas as pd
data = pd.read_csv("./genes.txt", sep = "\t")
data
## name a c g t
## 0 gene_1 11.11 12.34 4.44 23.55
## 1 gene_2 22.22 23.45 5.55 10.23
## 2 gene_3 33.33 34.56 6.66 14.11
data = pd.read_csv("./genes.txt", sep = "\t", header = 0)
data
## name a c g t
## 0 gene_1 11.11 12.34 4.44 23.55
## 1 gene_2 22.22 23.45 5.55 10.23
## 2 gene_3 33.33 34.56 6.66 14.11
data = pd.read_csv("./genes.txt", sep = "\t", header = -1)
data
## 0 1 2 3 4
## 0 name a c g t
## 1 gene_1 11.11 12.34 4.44 23.55
## 2 gene_2 22.22 23.45 5.55 10.23
## 3 gene_3 33.33 34.56 6.66 14.11
ファイルの書き込み
DataFrame 型のデータをファイルに書き込むとき to_csv
メソッドを利用する。
import pandas as pd
s_gene = pd.Series(["gene_1", "gene_2", "gene_3", "gene_4"])
s_updown = pd.Series(["up", "up", "down", "down"])
s_fc = pd.Series([2.1, 4.5, -2.3, -3.1])
x = pd.DataFrame({'a': s_gene, 'b': s_updown, 'c': s_fc})
x.columns = ['gene', 'updown', 'foldchange']
x.index = ['ers1', 'ein4', 'ein3', 'rap2.16']
x.to_csv('./data.csv')
x.to_csv('./data.tsv', sep = '\t')