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
関数はヒストグラムを作成する際に便利な関数となっているので、その面での使い勝手がとても良いです。
データの概要を知る重要な手がかりとなるでしょう。