逆引きPandas (DataFrame編)

R逆引きハンドブックのMatrixの章をPandasで。

ProductName R言語逆引きハンドブック
石田基広
シーアンドアール研究所 / 4830円 ( 2012-01-26 )


作者の書いた本はオススメ

ProductName Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理
Wes McKinney
オライリージャパン / 3780円 ( 2013-12-26 )


データフレームを作成する

>>> pd.DataFrame([[1,2,3],[4,5,6]])
   0  1  2
0  1  2  3
1  4  5  6

データフレームに列名と行名を追加

>>> x = pd.DataFrame([[1,2,3],[4,5,6]])
>>> pd.DataFrame([[1,2,3],[4,5,6]])
   0  1  2
0  1  2  3
1  4  5  6
>>> x = pd.DataFrame([[1,2,3],[4,5,6]])
>>> x
   0  1  2
0  1  2  3
1  4  5  6
>>> x.index = list("ab")
>>> x.columns = list("cde")
>>> x
   c  d  e
a  1  2  3
b  4  5  6

データフレームの列にアクセスする

>>> x = pd.DataFrame([[1,2,3],[4,5,6]], index=list("ab"), columns=list("cde"))
>>> x
   c  d  e
a  1  2  3
b  4  5  6
>>> x["c"]
a    1
b    4
Name: c, dtype: int64
>>> x.c
a    1
b    4
Name: c, dtype: int64

Seriesが返ってくるのでメソッドもよべる

>>> x.c.mean()
2.5
>>> x.c.sum()
5

データフレームに要素を追加する

>>> x = pd.DataFrame([[1,2,3],[4,5,6]], index=list("ab"), columns=list("cde"))
>>> y = pd.Series([7,8,9], index=list("cde"))
>>> x.append(y, ignore_index=True)
   c  d  e
0  1  2  3
1  4  5  6
2  7  8  9

データフレームを結合する

rbind

::: python
>>> x
   0  1
0  1  0
1 -2  3
>>> x.append(x)
   0  1
0  1  0
1 -2  3
0  1  0
1 -2  3
>>> pd.concat([x, x], axis=0)
   0  1
0  1  0
1 -2  3
0  1  0
1 -2  3

cbind

::: python
>>> pd.concat([x, x], axis=1)
   0  1  0  1
0  1  0  1  0
1 -2  3 -2  3

データフレームから一部を抽出する

ggplotの組込みデータを使う。 wt>3のname,disp列を抽出

>>> from ggplot import mtcars
>>> mtcars[mtcars.wt > 3][["name","disp"]]
                   name   disp
3        Hornet 4 Drive  258.0
4     Hornet Sportabout  360.0
5               Valiant  225.0
6            Duster 360  360.0
7             Merc 240D  146.7
8              Merc 230  140.8
9              Merc 280  167.6
10            Merc 280C  167.6
11           Merc 450SE  275.8
12           Merc 450SL  275.8
13          Merc 450SLC  275.8
14   Cadillac Fleetwood  472.0
15  Lincoln Continental  460.0
16    Chrysler Imperial  440.0
21     Dodge Challenger  318.0
22          AMC Javelin  304.0
23           Camaro Z28  350.0
24     Pontiac Firebird  400.0
28       Ford Pantera L  351.0
30        Maserati Bora  301.0

データフレームの列を変換する

transform

>>> x = pd.DataFrame([(1,2),(3,4),(5,6),(7,8)])
>>> x
   0  1
0  1  2
1  3  4
2  5  6
3  7  8
>>> x[2] = x[0]+2
>>> x
   0  1  2
0  1  2  3
1  3  4  5
2  5  6  7
3  7  8  9

因子ごとに組み合わせを作成する

R expand.grid() function in Python

データフレームの列や行ごとの合計を求める

::: python
>>> x
   0  1  2
0  1  2  3
1  4  5  6
2  7  8  9
>>> x.sum(axis=0)
0    12
1    15
2    18
dtype: int64
>>> x.sum(axis=1)
0     6
1    15
2    24
dtype: int64

データフレームの列ごとに関数を適用する

>>> x = pd.DataFrame([(1,2),(3,4),(5,6),(7,8)])
>>> x.apply(sum)
0    16
1    20
dtype: int64

データフレームから欠損値を取り除く

>>> x = pd.DataFrame([(1,2),(3,np.nan),(np.nan,6),(7,8)])
>>> x
    0   1
0   1   2
1   3 NaN
2 NaN   6
3   7   8
>>> x.dropna()
   0  1
0  1  2
3  7  8

データフレームの列を分解、統合する

multiindex便利

>>> x = pd.DataFrame([(1,"Y"),(3,"N"),(6,"N"),(7,"Y")])
>>> x
   0  1
0  1  Y
1  3  N
2  6  N
3  7  Y
>>> y = x.groupby(1)
>>> y.head()
     0  1
1        
N 1  3  N
  2  6  N
Y 0  1  Y
  3  7  Y
>>> y.mean()
     0
1     
N  4.5
Y  4.0

縦長形式のデータフレームを横長形式に変換する

>>> x = pd.DataFrame([(1,0,1),(1,1,2),(1,2,0),(2,0,1),(2,1,1),(2,2,3),(3,0,0),(3,1,1),(3,2,2)], columns=["subject","time","conc"])
>>> x
   subject  time  conc
0        1     0     1
1        1     1     2
2        1     2     0
3        2     0     1
4        2     1     1
5        2     2     3
6        3     0     0
7        3     1     1
8        3     2     2
>>> x.pivot(index="time", columns="subject")
         conc      
subject     1  2  3
time               
0           1  1  0
1           2  1  1
2           0  3  2

データフレームを分割する

groupby

データフレームを並べ替える

>>> x = pd.DataFrame([(1,0,1),(1,1,2),(1,2,0),(2,0,1),(2,1,1),(2,2,3),(3,0,0),(3,1,1),(3,2,2)], columns=["subject","time","conc"])
>>> x
   subject  time  conc
0        1     0     1
1        1     1     2
2        1     2     0
3        2     0     1
4        2     1     1
5        2     2     3
6        3     0     0
7        3     1     1
8        3     2     2
>>> x.sort("time")
   subject  time  conc
0        1     0     1
3        2     0     1
6        3     0     0
1        1     1     2
4        2     1     1
7        3     1     1
2        1     2     0
5        2     2     3
8        3     2     2

逆引きPandas (Matrix編)

R逆引きハンドブックのMatrixの章をPandasで。

ProductName R言語逆引きハンドブック
石田基広
シーアンドアール研究所 / 4830円 ( 2012-01-26 )


Pandasの場合MatrixないからDataFrameだけど。

ProductName Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理
Wes McKinney
オライリージャパン / 3780円 ( 2013-12-26 )


行列ではなくデータフレーム

行列の演算を行う

>>> x = pd.DataFrame([[1,0],[-2,3]])
>>> y = pd.DataFrame([[-1,1],[4,2]])
>>> x.dot(y)
    0  1
0  -1  1
1  14  4
>>> x * y
   0  1
0 -1  0
1 -8  6

x %o% y はわからない

逆行列もnumpyに頼る感じ

行列の次元ごとに演算を適用する

applyでaxisで行か列かを選択する。applyはよく使う

>>> x
   0  1
0  1  0
1 -2  3
>>> x.apply(sum, axis=0) #colsum
0   -1
1    3
dtype: int64
>>> x.apply(sum, axis=1) #rowsum
0    1
1    1
dtype: int64

テータフレームを行列に変換する

numpyのarrayに

>>> x
   0  1
0  1  0
1 -2  3
>>> x.as_matrix()
array([[ 1,  0],
       [-2,  3]], dtype=int64)

行列に行名と列名を設定する

DataFrameなので

>>> x
   0  1
0  1  0
1 -2  3
>>> x.index
Int64Index([0, 1], dtype=int64)
>>> x.columns
Int64Index([0, 1], dtype=int64)
>>> x.index = list("ab")
>>> x.columns = list("cd")
>>> x
   c  d
a  1  0
b -2  3

行列の属性を確認する

>>> x.shape
(2, 2)

行列から成分を抽出する

>>> x
    0   1   2   3
0   1   2   3   4
1   5   6   7   8
2   9  10  11  12
3  13  14  15  16
>>> x.iloc[[2],[3]]
    3
2  12
>>> x.iloc[1:4,[3]]
    3
1   8
2  12
3  16

行列を結合する

rbind

concatで行か列を指定する。これもよく使う

>>> x
   0  1
0  1  0
1 -2  3
>>> x.append(x)
   0  1
0  1  0
1 -2  3
0  1  0
1 -2  3
>>> pd.concat([x, x], axis=0)
   0  1
0  1  0
1 -2  3
0  1  0
1 -2  3

cbind

>>> pd.concat([x, x], axis=1)
   0  1  0  1
0  1  0  1  0
1 -2  3 -2  3

対角行列を作成する

>>> pd.DataFrame(np.diag(range(4)))
   0  1  2  3
0  0  0  0  0
1  0  1  0  0
2  0  0  2  0
3  0  0  0  3

三角行列を作成する

>>> x
   0  1  2
0  1  2  3
1  4  5  6
2  7  8  9
>>> pd.DataFrame(np.triu(x.as_matrix()))
   0  1  2
0  1  2  3
1  0  5  6
2  0  0  9
>>> pd.DataFrame(np.tril(x.as_matrix()))
   0  1  2
0  1  0  0
1  4  5  0
2  7  8  9

転置行列を作成する

>>> x
   0  1  2
0  1  2  3
1  4  5  6
2  7  8  9
>>> x.T
   0  1  2
0  1  4  7
1  2  5  8
2  3  6  9

列や行ごとの和や周辺和を求める

>>> x
   0  1  2
0  1  2  3
1  4  5  6
2  7  8  9
>>> x.sum(axis=0)
0    12
1    15
2    18
dtype: int64
>>> x.sum(axis=1)
0     6
1    15
2    24
dtype: int64
>>> x.sum(axis=0).sum()
45

固有値分解、特異値分解を適用する

固有値分解

>>> x
   0  1
0  4  1
1  1  4
>>> pd.DataFrame(np.linalg.eig(x.as_matrix())[1])
          0         1
0  0.707107 -0.707107
1  0.707107  0.707107

特異値分解は知らん

逆引きPandas (ベクトル編)

pandas本はpandasの話がメインなので逆引きがないのが辛いかなと思う。pandasに慣れると手放せないけど☆

ProductName Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理
Wes McKinney
オライリージャパン / 3780円 ( 2013-12-26 )


というわけで、R言語逆引きハンドブックのベクトルの章をPandasでやってみた。

文字列を規則的に合成したベクトルを作成する

n = pd.Series(range(1,10))
n.apply(lambda r: "ID " + str(r))

因子を作成する

f = pd.Series(["y","n","y","n","n"])
pd.factorize(f)
(array([0, 1, 0, 1, 1]), array(['y', 'n'], dtype=object))

Why does pandas (python library) has no factor like variable?に書かれている

  • 因子の水準に並び順を定義する
  • 使われていない因子の水準を削除する
  • 因子の水準に大小関係を設定する
  • 因子の水準を自由に組み合わせる
  • 因子の水準ごとに関数を適用する

論理ベクトルを作成する

as.logicalに対応するものはない?

pd.Series([True, False, True, True])

論理ベクトルを計算する

>>> r = pd.Series(range(11))
>>> l = r[r > 5]
>>> l.sum()
5
>>> l.any()
True

which?

>>> l[l == True].index
Int64Index([6, 7, 8, 9, 10], dtype=int64)

空のベクトルを初期化する

>>> pd.Series([])
Series([], dtype: float64)

ベクトルの要素数を変更する

length(x) <- 10

みたいにサイズを増やすことはできない?

減らすのは

>>> a = pd.Series(range(10))
>>> a[:5]
0    0
1    1
2    2
3    3
4    4
dtype: int64

ベクトルの要素に名前をつける

>>> a = pd.Series(range(5), index=list("abcde"))
>>> a
a    0
b    1
c    2
d    3
e    4
dtype: int64
>>> a["c"]
2

ベクトルから要素を抽出する

>>> a = pd.Series(range(5), index=list("abcde"))
>>> a[list("ace")]
a    0
c    2
e    4
dtype: int64
>>> a[[0,2,4]]
a    0
c    2
e    4
dtype: int64
>>> a[(a<1)|(a>3)]
a    0
e    4
dtype: int64

ベクトルから条件に適合する添字番号を取得する

indexを使う

>>> a = pd.Series(range(5))
>>> a[(a<1)|(a>3)].index
Int64Index([0, 4], dtype=int64)

ベクトルの要素を並べ替える

>>> import numpy as np
>>> a = pd.Series(range(5))
>>> a.reindex(np.random.permutation(a.index))
2    2
0    0
3    3
1    1
4    4
dtype: int64
>>> b = a.reindex(np.random.permutation(a.index))
>>> b.sort()
>>> b
0    0
1    1
2    2
3    3
4    4
dtype: int64

ベクトルの要素を置き換える

>>> a = pd.Series(range(5))
>>> a
0    0
1    1
2    2
3    3
4    4
dtype: int64
>>> a[(a<1)|(a>3)] = 10
>>> a
0    10
1     1
2     2
3     3
4    10
dtype: int64

ベクトルに要素を追加する

>>> a = pd.Series(range(5))
>>> a.append(pd.Series([0,0,0,0]))
0    0
1    1
2    2
3    3
4    4
0    0
1    0
2    0
3    0
dtype: int64

ベクトルの要素の重複を調べる

>>> a = pd.Series([1,2,3,4,5,4,6,3,2])
>>> a.duplicated()
0    False
1    False
2    False
3    False
4    False
5     True
6    False
7     True
8     True
dtype: bool
>>> a[a.duplicated()]
5    4
7    3
8    2
dtype: int64

ベクトルの要素の重複を削除する

>>> a.drop_duplicates()
0    1
1    2
2    3
3    4
4    5
6    6
dtype: int64

R逆引きハンドブックは手元に置いておくと重宝する☆

ProductName R言語逆引きハンドブック
石田基広
シーアンドアール研究所 / 4830円 ( 2012-01-26 )


The PubChemQC project

中田さんが興味深い試みを始めていた

ChEMBLだとSARもろなデータなので、こちらで同じことやるのも楽しそう。pybel+pygamessでスクリプト書けばよさげ。

正月休みに考えてみようかな。

ChEMBLといえば来月勉強会やるので興味があれば是非参加を。(懇親会のみでももちろん歓迎です☆)

aromantic factor

という、メディシナルケミストリーにとって非ロマンチックな指標を思いついでウキウキしてみたが、それって結局1-fsp3じゃないかと気付いてげんなりしたのであった

ProductName メディシナルケミストリー
Graham L. Patrick
丸善 / ?円 ( 2003-03 )


今週読んだ本(131216-131221)

透明かつせつない

ProductName 落下する夕方 (角川文庫)
江國 香織
角川書店 / 560円 ( 1999-06 )


決壊のレビューにこっちも面白いと書いてあったので読んでみた。面白いけど、決壊は分人主義だからなぁ。こっちはミステリー要素が強いのかな?残りの巻を読むのが楽しみ

ProductName 模倣犯1 (新潮文庫)
宮部 みゆき
新潮社 / 830円 ( 2005-11-26 )


ProductName 模倣犯2 (新潮文庫)
宮部 みゆき
新潮社 / 662円 ( 2005-11-26 )


不思議な感覚

ProductName 砂の女 (新潮文庫)
安部 公房
新潮社 / 546円 ( 2003-03 )


陰影のコントラストが大切

ProductName 陰翳礼讃 (中公文庫)
谷崎 潤一郎
中央公論社 / 500円 ( 1995-09-18 )


退廃的な感じが好き

ProductName 新装版 限りなく透明に近いブルー (講談社文庫)
村上 龍
講談社 / 420円 ( 2009-04-15 )


三浦しをんも書いていたので読んだ

ProductName 最後の恋―つまり、自分史上最高の恋。 (新潮文庫)
阿川 佐和子
新潮社 / 578円 ( 2008-11-27 )


よく分からない不条理さというか

ProductName □ しかく
阿部 和重
リトル・モア / 1470円 ( 2013-05-08 )


情景がありありと浮かぶ。これは読んで良かった。

ProductName 銀の匙 (岩波文庫)
中 勘助
岩波書店 / 588円 ( 1999-05-17 )


軽く読めた

挫折した

ProductName 叶えられた祈り (新潮文庫)
トルーマン カポーティ
新潮社 / 580円 ( 2006-07-28 )


最近飲んだ日本酒(131219)

一白水成は綺麗な味わい。

1387459233 1387459234

奈良萬のおりがらみ。

1387459236

新政の限定のやつ、東京駅のはせがわ酒店で購入。

1387459237

庭のうぐいすの冬濁りはシュワシュワ感が強かった。

1387459239

pychembldbをChEMBL17に対応させた

(小指のミスで下書き消えたので投げやり)

PostgreSQLで使う場合はPsycopgをインストールして環境変数CHEMBL_URIを変える

CHEMBL_URI=postgresql+psycopg2://localhost/chembl_17

こんだけです。

尚、来年の1/18にChEMBLのハンズオンとかRedmineの事例紹介をやりますので、細かいこと聞きたいとか、dancyuで絶賛された地ビール飲みたいとかいうヒトは参加されるといいと思います。

というより、早めに人数が集まらないと懇親会の予約が取りにくいので困ります。bg7860とかとっとと登録してください。

あと、SureChemblっていうパテントに特化した構造データベースも立ち上がるみたいなので情報交換出来るといいですね。

また、時間があれば「創薬に役立つ統合TVベストn」とかやれればと思います。

今週読んだ本(131208-131214)

これはかなり好き。デジャブったからかな。

ProductName 国道沿いのファミレス
畑野 智美
集英社 / 1470円 ( 2011-02-25 )


江國香織は安定の透明感というかカタルシス

ProductName 神様のボート (新潮文庫)
江國 香織
新潮社 / 515円 ( 2002-06-28 )


こういう風にお酒を飲みたい

ProductName センセイの鞄 (文春文庫)
川上 弘美
文藝春秋 / 560円 ( 2004-09-03 )


村上春樹もよかった

ProductName ダンス・ダンス・ダンス(上) (講談社文庫)
村上 春樹
講談社 / 680円 ( 2004-10-15 )


ProductName ダンス・ダンス・ダンス(下) (講談社文庫)
村上 春樹
講談社 / 680円 ( 2004-10-15 )


陰翳礼讃

ProductName 真昼なのに昏い部屋 (講談社文庫)
江國 香織
講談社 / 500円 ( 2013-02-15 )


大衆受けのする感じかな。ちょっと浅い。

ProductName ヘヴンリー・ブルー (集英社文庫)
村山由佳
集英社 / ?円 ( 2012-11-15 )


平野啓一郎の力強さは読み応えがある。

ProductName かたちだけの愛
平野 啓一郎
中央公論新社 / 1785円 ( 2010-12-10 )


白痴まで読んでストップ。あわない。

ProductName 白痴 (新潮文庫)
坂口 安吾
新潮社 / 483円 ( 1949-01-03 )


今週読んだ本(131201-131207)

天国旅行は心中をテーマに扱った作品集。三浦しをんはダーク目のほうが好き(明るいほうは読んだことない)

ProductName 天国旅行 (新潮文庫)
三浦 しをん
新潮社 / 546円 ( 2013-07-27 )


カラフルの前向きさは良かった。なかなか好きな作品

ProductName カラフル (文春文庫)
森 絵都
文藝春秋 / 536円 ( 2007-09-04 )


それほど惹かれなかった

ProductName 蹴りたい背中
綿矢りさ
河出書房新社 / ?円 ( 2013-10-04 )


江國香織の透明感のある文章はかなり好きな感じ。つめたい夜にでは「デューク」「いつか、ずっと昔」「スイート・ラバーズ」が心に残った。号泣する準備はできていたも良かったけどあまり強く惹かれたのはなかったかな。

ProductName つめたいよるに (新潮文庫)
江國 香織
新潮社 / 452円 ( 1996-05-29 )


ProductName 号泣する準備はできていた
江國 香織
新潮社 / 1470円 ( 2003-11-19 )


平野啓一郎はずっしりした読後感が味わえて好き。

ProductName 決壊〈上〉 (新潮文庫)
平野 啓一郎
新潮社 / 704円 ( 2011-05-28 )


ProductName 決壊〈下〉 (新潮文庫)
平野 啓一郎
新潮社 / 746円 ( 2011-05-28 )


平野啓一郎のあとに軽めのものを。デザート的に読めた。前向き

ProductName 夏の約束
藤野 千夜
講談社 / ?円 ( 2000-02 )


挫折した本

ProductName わたくし率 イン 歯ー、または世界
川上 未映子
講談社 / 1365円 ( 2007-07-26 )


ProductName ニッポニアニッポン
阿部 和重
新潮社 / ?円 ( 2001-08 )