データ分析で「この値は何回出てくるか」を調べたいことがよくあります。pandas の value_counts を使えば、値の出現回数を簡単にカウントできます。
基本的な使い方
Series に対して value_counts() を呼び出すと、値ごとの出現回数が降順で返されます。
import pandas as pd df = pd.DataFrame({ 'fruit': ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'] }) counts = df['fruit'].value_counts() print(counts)
apple が 3 回、banana が 2 回、orange が 1 回という結果になります。デフォルトでは出現回数の多い順に並びます。
昇順に並び替える
出現回数の少ない順にするには ascending=True を指定します。
counts = df['fruit'].value_counts(ascending=True)
割合を取得する
normalize=True を指定すると、回数ではなく割合(相対度数)が返されます。
df['fruit'].value_counts(normalize=True)
結果は 0 から 1 の間の値になります。100 を掛ければパーセンテージになります。
df['fruit'].value_counts(normalize=True) * 100
欠損値をカウントに含める
デフォルトでは NaN はカウントされません。含めるには dropna=False を指定します。
df = pd.DataFrame({ 'status': ['active', 'inactive', None, 'active', None] }) # NaN を含めない(デフォルト) df['status'].value_counts() # NaN も含める df['status'].value_counts(dropna=False)
値をビン(区間)で集計する
数値データの場合、bins を指定すると区間ごとにカウントできます。
df = pd.DataFrame({ 'age': [22, 35, 28, 45, 31, 55, 42, 38] }) df['age'].value_counts(bins=4)
これは pd.cut でビニングしてからカウントするのと同じ結果になります。
特定の値だけカウントする
isin と組み合わせると、特定の値だけをフィルタしてカウントできます。
df = pd.DataFrame({ 'color': ['red', 'blue', 'green', 'red', 'yellow', 'blue'] }) # red と blue だけカウント df[df['color'].isin(['red', 'blue'])]['color'].value_counts()
DataFrame 全体でカウントする
DataFrame の複数の列を一度にカウントしたい場合は、apply を使います。
df = pd.DataFrame({ 'A': ['x', 'y', 'x'], 'B': ['y', 'y', 'z'] }) df.apply(pd.Series.value_counts)
各列ごとの value_counts が並んだ DataFrame が返されます。
結果をデータフレームに変換する
value_counts の結果は Series ですが、reset_index でデータフレームに変換できます。
df = pd.DataFrame({ 'fruit': ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'] }) counts_df = df['fruit'].value_counts().reset_index() counts_df.columns = ['fruit', 'count'] print(counts_df)
または、pandas 2.0 以降では name パラメータが使えます。
counts_df = df['fruit'].value_counts().reset_index(name='count')
value_counts はデータの分布を素早く確認するのに便利です。カテゴリ変数の偏りや欠損値の割合を調べるときに、まず使ってみる関数の一つです。