Python で解析 10
“Advent Calendar 2013 - Python で解析!” の十日目。DataFrame - 6
1. お決まりの準備を…
今回は DataFrame の join について。 join は merge のお手軽版といったところのようだ。インデックスがあって、カラムが重複していない場合には、merge よりもお手軽なので、使いやすいと思われる。という訳で、準備を。
In [1]: import pandas as pd In [2]: df1 = pd.DataFrame({ ...: u'名前': [u'山田', u'鈴木', u'佐藤', u'木村'], ...: u'性別': [u'男', u'男', u'女', u'女'] , ...: u'身長': [181, 173, 159, 164], ...: u'体重': [79, 71, 51, 52] ...: }, ...: index=['3B005', '3B003', '3B002', '3B001'] ...: ) In [3]: df2 = pd.DataFrame({ ...: u'誕生日': ['1981/01/01', '1982/02/02', '1983/03/03', '1984/04/04'] ...: }, ...: index=['3B004','3B005','3B003', '3B002'] ...: ) In [4]: df3 = pd.DataFrame({ ...: u'好きなもの': [u'りんご', u'ばなな', u'いちご', u'メロン'], ...: }, ...: index=['3B004','3B005','3B003', '3B001'] ...: ) In [5]: df1 Out[5]: 体重 名前 性別 身長 3B005 79 山田 男 181 3B003 71 鈴木 男 173 3B002 51 佐藤 女 159 3B001 52 木村 女 164 In [6]: df2 Out[6]: 誕生日 3B004 1981/01/01 3B005 1982/02/02 3B003 1983/03/03 3B002 1984/04/04 In [7]: df3 Out[7]: 好きなもの 3B004 りんご 3B005 ばなな 3B003 いちご 3B001 メロン
今回は DataFrame が三つある。そして、それぞれのカラムが別々で、名前や性別は df1 にしかない。その代わりに index が付けてある。 index は初めて登場するが、RDBMS でいうところのプライマリーキーのようなものだ。そして、プリフィックスとして '3B' が付いているのは "三年 B 組、金八先生!" を思い出して付けてみただけ。深い意味はない。
2. 早速 join
論より証拠ということで join してみる。
In [8]: df1.join(df2) Out[8]: 体重 名前 性別 身長 誕生日 3B005 79 山田 男 181 1982/02/02 3B003 71 鈴木 男 173 1983/03/03 3B002 51 佐藤 女 159 1984/04/04 3B001 52 木村 女 164 NaN
逆にするとこうなる。
In [9]: df2.join(df1) Out[9]: 誕生日 体重 名前 性別 身長 3B004 1981/01/01 NaN NaN NaN NaN 3B005 1982/02/02 79 山田 男 181 3B003 1983/03/03 71 鈴木 男 173 3B002 1984/04/04 51 佐藤 女 159
3. 複数の join
たぶん、 join の真骨頂はこれ。
In [10]: df4 = df1.join([df2, df3]) In [11]: df4 Out[11]: 体重 名前 性別 身長 誕生日 好きなもの 3B005 79 山田 男 181 1982/02/02 ばなな 3B003 71 鈴木 男 173 1983/03/03 いちご 3B002 51 佐藤 女 159 1984/04/04 NaN 3B001 52 木村 女 164 NaN メロン
インデックスさえ一致していれば (& 重複カラムがなければ)、複数の DataFrame を簡単に統合できてしまう。これに慣れてしまうと、SQL が面倒になってしまうのが弊害か…。
4. おまけ
カラムやインデックスを確認する方法は次の通り。
In [12]: df4.columns Out[12]: Index([u'体重', u'名前', u'性別', u'身長', u'誕生日', u'好きなもの'], dtype=object) In [13]: df4.index Out[13]: Index([u'3B005', u'3B003', u'3B002', u'3B001'], dtype=object)
付け替えることもできる。
In [14]: df4.columns = ['weight', 'name', 'sex', 'height', 'birthday', 'favorite food'] In [15]: df4.columns Out[15]: Index([u'weight', u'name', u'sex', u'height', u'birthday', u'favorite food'], dtype=object)
以後、新しいカラム名を使って操作することになる。
In [16]: df4[u'weight'] Out[16]: 3B005 79 3B003 71 3B002 51 3B001 52 Name: weight, dtype: int64
今回はこんなところで。