Python で解析 22
“Advent Calendar 2013 - Python で解析!” の二十二日目。DataFrame - 15
今回はカテゴリーデータの扱いについて。カテゴリーデータというのは大きさを表す数字ではなく、種類を表すもので、例えばどのブラウザからのアクセスが多いか? のような時に活用する。
1. データの準備
では、いつもの通りのデータの準備を。
In [1]: import pandas as pd In [2]: df = pd.DataFrame({ ...: 'accessed': ['2013-12-21', '2013-12-21', '2013-12-21', '2013-12-22', '2013-12-22'], ...: 'user_id': [14600, 29000, 8800, 12100, 14600], ...: 'browser': ['IE', 'IE', 'Safari', 'Chrome', 'IE'] ...: }) In [3]: df Out[3]: accessed browser user_id 0 2013-12-21 IE 14600 1 2013-12-21 IE 29000 2 2013-12-21 Safari 8800 3 2013-12-22 Chrome 12100 4 2013-12-22 IE 14600
2. value_counts
カテゴリーデータの数を数える時は value_counts を使う。まずは、ブラウザ別。
In [4]: df.browser.value_counts() Out[4]: IE 3 Safari 1 Chrome 1 dtype: int64
次は日別。
In [5]: df.accessed.value_counts() Out[5]: 2013-12-21 3 2013-12-22 2 dtype: int64
そして、日毎のブラウザ別。
In [6]: df.groupby('accessed').browser.value_counts() Out[6]: accessed 2013-12-21 IE 2 Safari 1 2013-12-22 IE 1 Chrome 1 dtype: int64
3. stack, unstack
日毎のブラウザ別のヤツは、数が多くなって来ると、どのブラウザのアクセスが多いのか? とか、増加傾向にあるのか、減少傾向にあるのか? といったことが見づらくなる。そこで、ブラウザをカラムにして、見やすくしたい…という場合は unstack を使う。
In [7]: df.groupby('accessed').browser.value_counts().unstack() Out[7]: Chrome IE Safari accessed 2013-12-21 NaN 2 1 2013-12-22 1 1 NaN
unstack の逆は stack で、実は、元のデータを stack 表示することもできる。
In [8]: df.stack() Out[8]: 0 accessed 2013-12-21 browser IE user_id 14600 1 accessed 2013-12-21 browser IE user_id 29000 2 accessed 2013-12-21 browser Safari user_id 8800 3 accessed 2013-12-22 browser Chrome user_id 12100 4 accessed 2013-12-22 browser IE user_id 14600 dtype: object
stack <-> unstack は DataFrame <-> Series の相互変換になっていて、 Series にする時には SQL でいうところの複合キーが生成されている。
In [9]: df.stack().index Out[9]: MultiIndex [(0, u'accessed'), (0, u'browser'), (0, u'user_id'), (1, u'accessed'), (1, u'browser'), (1, u'user_id'), (2, u'accessed'), (2, u'browser'), (2, u'user_id'), (3, u'accessed'), (3, u'browser'), (3, u'user_id'), (4, u'accessed'), (4, u'browser'), (4, u'user_id')]
カラムが第二キーなっているのが分かる。
今回はこんなところで。