Pandas

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')