PandasではSeriesやDataFrameの列データに含まれているデータの個数を調べる関数countや、各々のデータの値の出現回数(頻度)を求めることのできるvalue_counts関数が存在します。

本記事ではその中で、値ごとの出現回数を数えるvalue_counts関数の使い方について解説します。

データ全体のデータ数を数え上げるcount関数の使い方については以下の記事を参照してください。

Pandasでデータの個数を数え上げるcount関数の使い方 /features/pandas-count.html

頻度からヒストグラムの作成方法を知りたい方は以下の記事を参照してください。

Pandasでヒストグラムの作成や頻度を出力する方法 /features/pandas-hist.html

また、groupbyと併用することでより柔軟な値のカウントを行うことができます。

value_counts関数

value_count関数はそれぞれの値の出現回数を数え上げてくれる関数です。[1,1,1,0,0]というデータがあれば1が3回、0が2回出てきます。

ヒストグラムの描画の時にも使われます。

APIドキュメント

value_counts関数のAPIドキュメントは以下の通りです。value_counts関数はSeriesにしか存在しないのでDataFrameに適用させたい時はapplyを使う必要があります。

pandas.Series.value_counts(normalize=False,sort=True,ascending=False,bins=None,dropna=True)

params:

パラメータ名 概要
normalize bool値 (省略可能)初期値False
Trueにすると、返される値が相対的な出現頻度となります。
sort bool値 (省略可能)初期値True
数え上げる値によってソート(並び替える)するかどうかを指定します。
ascending bool値 (省略可能)初期値False
ソートする際、結果を昇順で並び替えるかどうかを指定します。
bins int (省略可能)初期値None
数値データに対して、ある一定の範囲を半開区間で数え上げます。bins引数を指定するとその区切る個数を指定することができます。
dropna bool値 (省略可能)初期値True
欠損値をカウントせずに飛ばすかどうかを指定します。Trueにするとカウントしません。

returns:

それぞれの値の個数をデータとして含むSeriesが返されます。

基本的な数え方

まずは特に引数を指定しない場合についてです。

In [1]: import pandas as pd

In [2]: sr = pd.Series(['a','a','a','b','b','c','c','e', None])

In [4]: sr
Out[4]:
0       a
1       a
2       a
3       b
4       b
5       c
6       c
7       e
8    None
dtype: object

In [5]: sr.value_counts() # それぞれの値の出現回数をカウントしてくれる。
Out[5]:
a    3
c    2
b    2
e    1
dtype: int64

簡単に頻度を求めることができます。

相対的な頻度に変換する

では、先ほどの結果を絶対的な頻度ではなく、相対的な割合に変えてみます。割合に変えるためには、normalize=Trueを指定します。

指定すると、データ全体の中でのその値の数の割合をよりわかりやすくすることができます。

In [7]: sr.value_counts(normalize=True) # 相対的頻度を出す
Out[7]:
a    0.375
c    0.250
b    0.250
e    0.125
dtype: float64

全体の4割近くのデータが'a'というデータで占められていることがわかります。

結果をソートする

先ほどの結果を出現頻度の多い順に並べ替えたい時はsort=Trueを使います。(デフォルトでTrueになっています) また、昇順にしたい場合はascending=Trueにする必要があります。

In [8]: sr
Out[8]:
0       a
1       a
2       a
3       b
4       b
5       c
6       c
7       e
8    None
dtype: object

In [11]: sr.value_counts(sort=True)
Out[11]:
a    3
c    2
b    2
e    1
dtype: int64

In [12]: sr.value_counts(sort=True,ascending=True) # 昇順に並べ替え
Out[12]:
e    1
b    2
c    2
a    3
dtype: int64

いくつかの区間に区切って数え上げる

bins引数を使って数値データの範囲を区切り、その範囲に含まれる値の個数をカウントします。

NumPyを使って乱数を発生させていきます。


In [13]: import numpy as np

In [14]: data = np.random.randn(100) # 正規分布に従った乱数を100個生成

In [15]: sr_2 = pd.Series(data)

In [16]: sr_2.value_counts(bins=5) # 5個の区間に分けてカウント
Out[16]:
(-0.323, 0.639]                  39
(-1.285, -0.323]                 22
(0.639, 1.6]                     17
(-2.2529999999999997, -1.285]    13
(1.6, 2.562]                      9
dtype: int64

In [17]: sr_2.value_counts(bins=10) # 10個の区間に分けてカウント
Out[17]:
(0.158, 0.639]                   22
(-0.323, 0.158]                  17
(-0.804, -0.323]                 15
(0.639, 1.12]                    12
(-1.766, -1.285]                  8
(-1.285, -0.804]                  7
(1.6, 2.081]                      6
(1.12, 1.6]                       5
(-2.2529999999999997, -1.766]     5
(2.081, 2.562]                    3
dtype: int64

このように、半開区間ごとに値が区切られています。

DataFrameに適用する

DataFrame全体にvalue_countsを適用させたい時はapply関数と併用します。

apply関数はDataFrameの列ごとに関数を適用させる関数でした。

詳しい解説は以下の記事を参考にしてください。

Pandasのデータに関数を適用させるapply関数applymap関数map関数の使い方 /features/pandas-apply.html

In [18]: df = pd.DataFrame({'A':[0,1,0,1,1,1,1],'B':[1,1,2,2,1,1,1]})

In [20]: df.apply(pd.value_counts)
Out[20]:
     A    B
0  2.0  NaN
1  5.0  5.0
2  NaN  2.0

このように、DataFrameが作られます。 インデックスがカウントする値になっています。

まとめ

今回は、要素の出現回数について数え上げるvalue_counts関数の使い方についてまとめました。 value_counts関数はヒストグラムを作成する際に便利な関数となっているので、その面での使い勝手がとても良いです。

データの概要を知る重要な手がかりとなるでしょう。

参考