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

今回はこんなところで。