Pandasでのユニークな値の取得と頻度カウント
Pandasライブラリは、Pythonでデータ分析を行う上で不可欠なツールであり、特にデータフレーム操作においてはその威力を発揮します。データ分析の初期段階で、データの特性を理解するために、特定の列に含まれるユニークな値とその出現頻度を把握することは非常に重要です。Pandasは、このタスクを効率的かつ直感的に実行するための強力な機能を提供しています。
本稿では、Pandasにおけるユニークな値の取得方法と、それらの値の出現頻度をカウントする方法に焦点を当て、それぞれの機能の詳細、関連するメソッド、および実用的な応用例について解説します。
ユニークな値の取得
データフレームの特定の列やシリーズに含まれるユニークな(重複しない)値を取得するには、主に.unique()メソッドを使用します。このメソッドは、対象のシリーズから重複を除いた要素を順番に配列として返します。
.unique()メソッド
.unique()メソッドは、PandasのSeriesオブジェクトに対して呼び出されます。例えば、以下のようなデータフレームがあるとします。
import pandas as pd
data = {'Category': ['A', 'B', 'A', 'C', 'B', 'A', 'D', 'C', 'A'],
'Value': [10, 20, 15, 25, 20, 10, 30, 25, 15]}
df = pd.DataFrame(data)
このデータフレームの’Category’列に含まれるユニークな値を取得するには、次のように記述します。
unique_categories = df['Category'].unique()
print(unique_categories)
これにより、['A', 'B', 'C', 'D']という配列が出力されます。このメソッドは、データの種類を素早く把握するのに役立ちます。例えば、カテゴリカルデータの取りうる値を確認したり、欠損値(NaN)がユニークな値として含まれているかも確認できます。
.drop_duplicates()メソッド
もう一つのユニークな値を取得する方法として、.drop_duplicates()メソッドがあります。これは、SeriesだけでなくDataFrameに対しても使用でき、行全体を基準に重複を削除します。Seriesに対して使用した場合、.unique()と同様の結果が得られますが、DataFrameに対して使用する場合には、指定した列に基づいて重複を削除することができます。
# Seriesに対するdrop_duplicates()
unique_values_series = df['Value'].drop_duplicates()
print(unique_values_series)
# DataFrameに対するdrop_duplicates() (Category列で重複を削除)
unique_rows = df.drop_duplicates(subset=['Category'])
print(unique_rows)
.drop_duplicates()メソッドは、keep引数(デフォルトは’first’)で、重複する値のうちどれを残すか(’first’, ‘last’, False)を指定できます。Falseを指定すると、重複する行はすべて削除されます。
頻度カウント
ユニークな値を取得した後は、それぞれの値がデータセット内に何回出現するかをカウントすることが一般的です。Pandasでは、.value_counts()メソッドがこの目的のために設計されています。
.value_counts()メソッド
.value_counts()メソッドは、Seriesオブジェクトに対して呼び出され、ユニークな値とその出現頻度をSeriesとして返します。返されるSeriesのインデックスはユニークな値、値はそれぞれの出現回数となります。デフォルトでは、出現頻度が多い順にソートされます。
category_counts = df['Category'].value_counts()
print(category_counts)
出力例:
Category
A 4
B 2
C 2
D 1
Name: count, dtype: int64
このメソッドは、データの分布を理解する上で非常に強力です。どのカテゴリが最も一般的であるか、あるいはどの値が稀であるかを一目で把握できます。
.value_counts()メソッドには、いくつかの便利な引数があります。
-
normalize=True: この引数をTrueに設定すると、出現回数ではなく、相対頻度(合計に対する割合)で返されます。これは、データの分布をパーセンテージで理解したい場合に役立ちます。
normalized_counts = df['Category'].value_counts(normalize=True) -
sort=False: デフォルトではTrueになっており、出現頻度でソートされます。これをFalseにすると、ソートされずに返されます。
unsorted_counts = df['Category'].value_counts(sort=False) -
ascending=True: デフォルトではFalse(降順)ですが、これをTrueにすると昇順でソートされます。
ascending_counts = df['Category'].value_counts(ascending=True) -
dropna=True: デフォルトではTrueになっており、欠損値(NaN)はカウントから除外されます。これをFalseにすると、欠損値もカウントに含まれます。
counts_with_nan = df['Category'].value_counts(dropna=False)
.groupby()と.size() または .count()
.value_counts()はSeriesに特化したメソッドですが、より複雑な集計や、DataFrame全体にわたってグループごとのサイズをカウントしたい場合には、.groupby()メソッドと.size()(または.count())メソッドの組み合わせが強力です。
# 'Category'列でグループ化し、各グループのサイズをカウント
grouped_size = df.groupby('Category').size()
print(grouped_size)
# 'Category'列でグループ化し、'Value'列の非NaN値の数をカウント
grouped_count = df.groupby('Category')['Value'].count()
print(grouped_count)
.size()はグループ内の行数をそのまま返しますが、.count()は指定した列の非NaN値の数を返します。そのため、欠損値の扱いにおいて違いが出ます。.value_counts()がSeriesの要素に特化しているのに対し、.groupby()はDataFrameの列を基準にした集計により柔軟性をもたらします。
実用的な応用例
ユニークな値の取得と頻度カウントは、データ分析の様々な場面で活用されます。
-
データクリーニング:
.unique()で予期しない値(タイポ、無効なエントリなど)を発見し、.value_counts()でそれらの値の頻度を確認することで、データクレンジングの優先順位を決定できます。 -
特徴量エンジニアリング: カテゴリカル変数のエンコーディング(例:One-Hot Encoding)を行う前に、
.value_counts()で各カテゴリの出現頻度を確認することは、カテゴリの希少性や重要度を判断するのに役立ちます。頻度の低いカテゴリを「その他」にまとめるなどの戦略を立てやすくなります。 -
探索的データ分析 (EDA): データの全体像を把握するために、主要なカテゴリカル変数の分布を
.value_counts()で確認することは、EDAの基本的なステップです。これにより、データセットの構造や潜在的なパターンを理解する手がかりが得られます。 -
異常検知:
.value_counts()で極端に頻度の低い値や、逆に異常に高い頻度を持つ値を見つけることで、潜在的な異常値やデータ入力のエラーを検出する手がかりになります。
まとめ
Pandasの.unique()メソッドは、データセット内の重複しない値のリストを取得するためのシンプルかつ効果的な方法です。一方、.value_counts()メソッドは、これらのユニークな値がそれぞれどれだけの頻度で出現するかを把握するために不可欠な機能です。これらを組み合わせることで、データフレームの特定の列の特性を深く理解し、データクリーニング、特徴量エンジニアリング、探索的データ分析といった、データサイエンスワークフローの多くの段階で、より情報に基づいた意思決定を行うことができます。また、.groupby()と.size()/.count()を併用することで、より複雑な集計ニーズにも対応可能です。これらの機能を習得することは、Pandasを用いたデータ分析能力を飛躍的に向上させることに繋がります。
