Pandasでユニークな値を取得し頻度をカウント

プログラミング

Pandasでのユニークな値の取得と頻度カウント

Pandasライブラリは、Pythonにおけるデータ分析の強力なツールです。特に、SeriesやDataFrameといったデータ構造を扱う際に、その機能は際立ちます。データ分析の初期段階では、データの特性を理解するために、含まれるユニークな値を確認し、それぞれの出現頻度を把握することが不可欠です。Pandasは、この作業を効率的かつ直感的に行うための洗練されたメソッドを提供しています。

Seriesオブジェクトでのユニークな値の取得

PandasのSeriesオブジェクトは、一次元のラベル付き配列のようなもので、データ分析の基本単位となります。Seriesに含まれるユニークな値を取得するには、.unique()メソッドを使用します。このメソッドは、Series内の重複しない要素を配列として返します。返される配列の順序は、元のSeriesでの出現順序に基づいています。

.unique()メソッドの活用例

import pandas as pd

# サンプルのSeriesを作成
data = ['A', 'B', 'A', 'C', 'B', 'A', 'D']
s = pd.Series(data)

# ユニークな値を取得
unique_values = s.unique()
print(unique_values)
# 出力: ['A' 'B' 'C' 'D']

この例では、Series s には ‘A’, ‘B’, ‘C’, ‘D’ の4つのユニークな値が含まれていることがわかります。

Seriesオブジェクトでの頻度カウント

ユニークな値を取得した後は、それらがそれぞれ何回出現するかを数える、つまり頻度をカウントすることが一般的です。Pandasでは、.value_counts()メソッドがこの目的に最適です。このメソッドは、Series内の各ユニークな値の出現回数を計算し、結果を新しいSeriesとして返します。返されるSeriesのインデックスはユニークな値となり、その値はその値の出現頻度となります。デフォルトでは、出現頻度が高い順にソートされて返されます。

.value_counts()メソッドの活用例

# サンプルのSeries s(上記と同じものを使用)

# 各ユニークな値の頻度をカウント
value_counts = s.value_counts()
print(value_counts)
# 出力:
# A    3
# B    2
# C    1
# D    1
# dtype: int64

この出力は、’A’が3回、’B’が2回、’C’と’D’がそれぞれ1回出現していることを示しています。

.value_counts()メソッドのオプション

.value_counts()メソッドは、いくつかの便利なオプションを持っています。

  • normalize=True: このオプションを True に設定すると、出現回数ではなく、相対頻度(全体の合計に対する割合)が計算されます。

            relative_frequencies = s.value_counts(normalize=True)
            print(relative_frequencies)
            # 出力:
            # A    0.428571
            # B    0.285714
            # C    0.142857
            # D    0.142857
            # dtype: float64
            
  • sort=False: デフォルトでは True になっており、出現頻度で降順にソートされますが、これを False にすると、元のSeriesでの出現順序に基づいたソートになります。

            unsorted_counts = s.value_counts(sort=False)
            print(unsorted_counts)
            # 出力(順序は実行環境により異なる場合があるが、ソートされていない):
            # A    3
            # B    2
            # C    1
            # D    1
            # dtype: int64
            
  • ascending=True: sort=True の場合(デフォルト)、このオプションを True にすると、出現頻度が昇順になります。

            ascending_counts = s.value_counts(ascending=True)
            print(ascending_counts)
            # 出力:
            # C    1
            # D    1
            # B    2
            # A    3
            # dtype: int64
            
  • dropna=False: デフォルトでは True になっており、NaN(欠損値)はカウントから除外されます。これを False にすると、NaNもユニークな値としてカウントされます。

            data_with_nan = ['A', 'B', None, 'A', 'C', None]
            s_nan = pd.Series(data_with_nan)
            counts_with_nan = s_nan.value_counts(dropna=False)
            print(counts_with_nan)
            # 出力:
            # A      2
            # NaN    2
            # B      1
            # C      1
            # dtype: int64
            

DataFrameオブジェクトでのユニークな値の取得と頻度カウント

DataFrameは、複数のSeriesを列として持つ二次元のデータ構造です。DataFrame全体、または特定の列(Series)に対して、ユニークな値の取得と頻度カウントを行うことができます。

DataFrameの特定の列に対する操作

DataFrameの特定の列に対しては、その列をSeriesとして参照し、上述の .unique() および .value_counts() メソッドを適用します。

import pandas as pd

# サンプルのDataFrameを作成
df_data = {'col1': ['A', 'B', 'A', 'C', 'B'],
           'col2': [1, 2, 1, 3, 2]}
df = pd.DataFrame(df_data)

# 'col1'列のユニークな値を取得
unique_col1 = df['col1'].unique()
print("Unique values in col1:", unique_col1)
# 出力: Unique values in col1: ['A' 'B' 'C']

# 'col1'列の頻度をカウント
counts_col1 = df['col1'].value_counts()
print("Value counts for col1:n", counts_col1)
# 出力:
# Value counts for col1:
# A    2
# B    2
# C    1
# Name: col1, dtype: int64

# 'col2'列のユニークな値を取得
unique_col2 = df['col2'].unique()
print("Unique values in col2:", unique_col2)
# 出力: Unique values in col2: [1 2 3]

# 'col2'列の頻度をカウント
counts_col2 = df['col2'].value_counts()
print("Value counts for col2:n", counts_col2)
# 出力:
# Value counts for col2:
# 1    2
# 2    2
# 3    1
# Name: col2, dtype: int64

DataFrameの複数列にわたるユニークな組み合わせのカウント

DataFrameの複数の列にわたるユニークな値の組み合わせをカウントしたい場合、.groupby()メソッドと.size()メソッドまたは.count()メソッドを組み合わせるのが一般的です。

# 'col1'と'col2'の組み合わせごとの頻度をカウント
grouped_counts = df.groupby(['col1', 'col2']).size()
print("Counts of unique combinations:n", grouped_counts)
# 出力:
# Counts of unique combinations:
# col1  col2
# A     1       2
# B     2       2
# C     3       1
# dtype: int64

この例では、(‘A’, 1) の組み合わせが2回、(‘B’, 2) が2回、(‘C’, 3) が1回出現していることがわかります。

DataFrame全体におけるユニークな行の取得

DataFrame全体でユニークな行を取得するには、.drop_duplicates()メソッドを使用します。このメソッドは、重複する行を削除した新しいDataFrameを返します。

# サンプルのDataFrame(重複行を追加)
df_data_dup = {'col1': ['A', 'B', 'A', 'C', 'B', 'A'],
               'col2': [1, 2, 1, 3, 2, 1]}
df_dup = pd.DataFrame(df_data_dup)

print("Original DataFrame:n", df_dup)

# ユニークな行を取得
unique_rows = df_dup.drop_duplicates()
print("DataFrame with unique rows:n", unique_rows)
# 出力:
# DataFrame with unique rows:
#   col1  col2
# 0    A     1
# 1    B     2
# 3    C     3

.drop_duplicates()メソッドには、subset引数で重複をチェックする列を指定したり、keep引数でどの重複行を残すか(’first’, ‘last’, False)を指定したりするオプションもあります。

応用的な使用方法と注意点

Pandasのユニーク値取得と頻度カウントは、データクリーニング、特徴量エンジニアリング、異常検知など、様々な場面で活用されます。例えば、カテゴリカル変数のエンコーディングを行う前に、.value_counts()で各カテゴリの出現頻度を確認し、希少なカテゴリをまとめて処理するなどの判断材料にできます。

注意点としては、.unique()はNumPy配列を返すのに対し、.value_counts()はPandas Seriesを返すという型の違いです。また、.value_counts()はデフォルトでNaNを除外するため、NaNの出現回数も把握したい場合は dropna=False を指定することを忘れないようにしましょう。

これらのメソッドを理解し、適切に使い分けることで、データに対する洞察を深め、より高度なデータ分析へと繋げることができます。

まとめ

Pandasは、.unique()メソッドと.value_counts()メソッドを提供することで、Seriesオブジェクトにおけるユニークな値の取得と頻度カウントを容易にします。.value_counts()メソッドは、normalizesortascendingdropnaといったオプションにより、柔軟な集計を可能にします。DataFrameにおいては、特定の列を参照してこれらのメソッドを適用するか、.groupby().size()を組み合わせて複数列にわたる組み合わせの頻度をカウントできます。また、.drop_duplicates()メソッドはDataFrame全体のユニークな行を抽出するのに役立ちます。これらの機能は、データ分析の初期段階におけるデータの理解を深め、その後の処理の基盤となります。