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')]

カラムが第二キーなっているのが分かる。

今回はこんなところで。