Pandas pd.value_counts() 関数
pd.value_counts()Pandasライブラリで使用される各値の出現頻度を集計する関数です。配列内の各一意な値の出現回数を計算し、頻度の降順で返します。
これはカテゴリデータ分析で最もよく使われる関数の1つで、データの分布状況をすばやく把握できます。例えば、投票結果や製品カテゴリの分布などを集計できます。
単語の意味: value_counts「値を集計する」という意味で、各値の出現回数を数えます。
基本構文とパラメータ
pd.value_counts()Pandasライブラリのトップレベル関数で、各一意な値の頻度を計算します。
構文形式
pd.value_counts(values, sort=True, ascending=False, normalize=False, bins=None, dropna=True)
パラメータの説明
- パラメータ:
values- 型: Series、配列類似オブジェクト。
- 説明: 頻度を集計するデータ。通常はSeriesです。
- パラメータ:
sort- 型: ブール値。
- 頻度で並べ替えるかどうか。デフォルトは
True(頻度の降順)。
ascending
- 型: ブール値。
- もし
Trueの場合は頻度の昇順で並べ替え、もしFalse(デフォルト)の場合は頻度の降順で並べ替えます。
normalize
- 型: ブール値。
- もし
Trueの場合は、絶対頻度ではなく各値の出現割合(0から1の間)を返します。デフォルトはFalse。
bins
- 型: 整数またはNone。
- 整数を指定すると、数値データをビンに分割して頻度を集計します(ヒストグラムに似ています)。カテゴリデータには適用できません。
dropna
- 型: ブール値。
- NaNを統計結果に含めるかどうか。デフォルトは
True(含めない)。
関数の説明
- 戻り値: 一意な値をインデックスとし、頻度(または割合)を値とするSeriesを返します。
- 効果: 各一意な値の出現回数を集計して表示します。
例
簡単なものから複雑なものまでの一連の例を通して、完全に習得しましょうpd.value_counts()の使い方を。
例1:基本的な使い方 - カテゴリデータの頻度を集計する
例
import pandas as pd
import numpy as np
# 1. 重複する値を持つSeriesを作成
colors = pd.Series(['red', 'blue', 'green', 'red', 'blue', 'yellow', 'red', 'blue', 'blue'])
print("=== 元のSeries ===")
print(colors)
# 2. pd.value_counts() を使って頻度を集計
result = pd.value_counts(colors)
print("\n=== pd.value_counts() による頻度集計 ===")
print(result)
import numpy as np
# 1. 重複する値を持つSeriesを作成
colors = pd.Series(['red', 'blue', 'green', 'red', 'blue', 'yellow', 'red', 'blue', 'blue'])
print("=== 元のSeries ===")
print(colors)
# 2. pd.value_counts() を使って頻度を集計
result = pd.value_counts(colors)
print("\n=== pd.value_counts() による頻度集計 ===")
print(result)
実行結果の想定:
=== 原始 Series === 0 red 1 blue 2 green 3 red 4 blue 5 yellow 6 red 7 blue 8 blue dtype: object === pd.value_counts() 频次统计 === blue 4 red 3 green 1 yellow 1 dtype: int64
コードの解説:
- 結果は頻度の降順で並び、blueが最も多く(4回)、redが次に多く(3回)、greenとyellowがそれぞれ1回です。
- 返されるのはSeriesで、インデックスは色の値、値は出現回数です。
例2:normalizeパラメータを使用して割合を計算する
normalize=True頻度を割合に変換して、データの相対的な分布を確認しやすくします。
例
import pandas as pd
import numpy as np
# 投票データを作成
votes = pd.Series(['A', 'B', 'A', 'C', 'A', 'B', 'A', 'A', 'C', 'B', 'A', 'B'])
print("=== 投票データ ===")
print(votes)
# 1. 絶対頻度
print("\n=== 絶対頻度 ===")
print(pd.value_counts(votes))
# 2. 相対割合(normalize=True)
print("\n=== 相対割合 ===")
result_normalized = pd.value_counts(votes, normalize=True)
print(result_normalized)
print(f"\n割合の合計: {result_normalized.sum():.2f}")
# 3. 昇順に並べ替え
print("\n=== 昇順の並べ替え ===")
print(pd.value_counts(votes, ascending=True))
import numpy as np
# 投票データを作成
votes = pd.Series(['A', 'B', 'A', 'C', 'A', 'B', 'A', 'A', 'C', 'B', 'A', 'B'])
print("=== 投票データ ===")
print(votes)
# 1. 絶対頻度
print("\n=== 絶対頻度 ===")
print(pd.value_counts(votes))
# 2. 相対割合(normalize=True)
print("\n=== 相対割合 ===")
result_normalized = pd.value_counts(votes, normalize=True)
print(result_normalized)
print(f"\n割合の合計: {result_normalized.sum():.2f}")
# 3. 昇順に並べ替え
print("\n=== 昇順の並べ替え ===")
print(pd.value_counts(votes, ascending=True))
実行結果の想定:
=== 投票数据 === 0 A 1 B 2 A 3 C 4 A 5 B 值 'A' 出现 6 次,占 50% 值 'B' 出现 4 次,约 33.3% 值 'C' 出现 2 次,约 16.7% === 相对比例 === A 0.500000 B 0.333333 C 0.166667 dtype: float64 === 升序排列 === C 2 B 4 A 6 dtype: int64
コードの解説:
- を使用すると
normalize=True各カテゴリの割合をすばやく計算できます。 - すべての割合を合計すると1.0になり、割合の分析に便利です。
- を使用すると
ascending=True頻度の昇順で結果を確認できます。
例3:数値データの処理とbinsパラメータの使用
連続する数値には、binsパラメータを使用してビン分割集計ができます。
例
import pandas as pd
import numpy as np
# 1. 数値データを作成
scores = pd.Series([85, 90, 78, 92, 88, 76, 95, 82, 70, 89, 91, 77, 84, 86])
print("=== 学生の成績 ===")
print(scores)
# 2. ビン分割なし - 各一意な値を集計
print("\n=== 各得点の集計 ===")
print(pd.value_counts(scores))
# 3. binsパラメータでビン分割
print("\n=== 4つのビンに分割 ===")
result_bins = pd.value_counts(scores, bins=4)
print(result_bins)
# 4. ビンの境界を確認
print("\n=== ビンの境界 ===")
print(f"最小値: {scores.min()}, 最大値: {scores.max()}")
import numpy as np
# 1. 数値データを作成
scores = pd.Series([85, 90, 78, 92, 88, 76, 95, 82, 70, 89, 91, 77, 84, 86])
print("=== 学生の成績 ===")
print(scores)
# 2. ビン分割なし - 各一意な値を集計
print("\n=== 各得点の集計 ===")
print(pd.value_counts(scores))
# 3. binsパラメータでビン分割
print("\n=== 4つのビンに分割 ===")
result_bins = pd.value_counts(scores, bins=4)
print(result_bins)
# 4. ビンの境界を確認
print("\n=== ビンの境界 ===")
print(f"最小値: {scores.min()}, 最大値: {scores.max()}")
実行結果の想定:
=== 学生成绩 === [85, 90, 78, 92, 88, 76, 95, 82, 70, 89, 91, 77, 84, 86] === 统计每个分数 === 85 2 90 1 78 1 92 1 88 1 76 1 95 1 82 1 70 1 89 1 91 1 77 1 84 1 86 1 Name: count, dtype: int64 === 分成 4 个箱 === result_bins = pd.value_counts(scores, bins=4) (88.75, 95.0] 5 (82.5, 88.75] 4 (76.25, 82.5] 3 (69.97399999999999, 76.25] 2 Name: count, dtype: int64 === 分箱边界 === 最小值: 70, 最大值: 95
これはヒストグラムに似ており、成績の分布が中高得点帯に集中していることがわかります。binsパラメータは数値データを範囲ごとに離散的なビンに分割し、各ビン内のデータ量を集計します。
例4:欠損値の処理
を使用するとdropnaパラメータで欠損値を集計するかどうかを制御できます。
例
import pandas as pd
import numpy as np
# 1. 欠損値を含むデータ
data = pd.Series(['a', 'b', np.nan, 'a', None, 'c', np.nan, 'b', 'a'])
print("=== 欠損値を含むデータ ===")
print(data)
# 2. デフォルトではNaNを含めない(dropna=True)
print("\n=== デフォルトではNaNを含めない ===")
print(pd.value_counts(data))
# 3. NaNを含める(dropna=False)
print("\n=== NaNを含める ===")
print(pd.value_counts(data, dropna=False))
# 4. 数値型の欠損値を集計
numeric_data = pd.Series([1, 2, np.nan, 3, 2, np.nan, 1, 4])
print("\n=== 数値型データにNaNを含める ===")
print(pd.value_counts(numeric_data, dropna=False))
import numpy as np
# 1. 欠損値を含むデータ
data = pd.Series(['a', 'b', np.nan, 'a', None, 'c', np.nan, 'b', 'a'])
print("=== 欠損値を含むデータ ===")
print(data)
# 2. デフォルトではNaNを含めない(dropna=True)
print("\n=== デフォルトではNaNを含めない ===")
print(pd.value_counts(data))
# 3. NaNを含める(dropna=False)
print("\n=== NaNを含める ===")
print(pd.value_counts(data, dropna=False))
# 4. 数値型の欠損値を集計
numeric_data = pd.Series([1, 2, np.nan, 3, 2, np.nan, 1, 4])
print("\n=== 数値型データにNaNを含める ===")
print(pd.value_counts(numeric_data, dropna=False))
実行結果の想定:
=== 包含缺失值的数据 === 0 a 1 b 2 NaN 3 a 4 None 5 c 6 NaN 7 b 8 a dtype: object === 默认不包含 NaN === a 3 b 2 c 1 dtype: 64 === 包含 NaN (dropna=False) === a 3 b 2 NaN 2 # 2 个 NaN (2 个 np.nan) c 1 dtype: int64 === 数值型数据包含 NaN === 1.0 2 2.0 2 NaN 2 # 2 个 NaN 3.0 1 4.0 1 dtype: int64
コードの解説:
- デフォルトでは(
dropna=True)、NaN値は集計されません。 - を使用すると
dropna=False欠損値の数を確認できます。これはデータ品質分析に役立ちます。 - 数値型データにも同様に適用できます。
その他の拡張ヒント:
pd.value_counts()は探索的データ分析において最も重要な関数の1つで、データの分布をすばやく把握できます。頻度を必要とせず一意な値のリストだけが必要な場合は、pd.unique()関数を使用してください。
Pandas よく使う関数