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