Pandas Seriesでデータの個性を明らかにしよう!nunique()で重複の有無を簡単チェック


pandas.Series.nunique() は、Pandas Series オブジェクト内の 重複していない要素の数 をカウントするメソッドです。つまり、Series に含まれるすべての値を調べ、それぞれが 異なる値かどうか を判断し、異なる値の個数を返します。

構文

Series.nunique(dropna=True)

引数

  • dropna (ブール値): デフォルトは True で、欠損値 (NaN) を除いた値の個数をカウントします。False に設定すると、欠損値を含むすべての値の個数をカウントします。

返値

  • Series: 各列の重複していない要素の個数を示す Series オブジェクト

import pandas as pd

# データの作成
data = {'A': [1, 2, 3, 1, 2, 4],
        'B': ['a', 'b', 'c', 'a', 'b', 'c']}
series = pd.Series(data)

# nunique() の実行
nunique_counts = series.nunique()

# 結果の表示
print(nunique_counts)
Output:

A    3
B    3
dtype: int64

この例では、A 列には 3 つの重複していない値 (1, 2, 4) があり、B 列にも 3 つの重複していない値 (a, b, c) があることがわかります。

  • nunique() は、カテゴリカルデータの分析によく使用されます。
  • 欠損値の処理方法を制御したい場合は、dropna 引数を使用してください。
  • nunique() は、データ分析において、データの多様性や重複の程度を把握する際に役立ちます。


例 1:基本的な動作

この例では、Series オブジェクトを作成し、nunique() 関数を使用して重複していない要素の個数をカウントします。

import pandas as pd

# データの作成
data = {'A': [1, 2, 3, 1, 2, 4],
        'B': ['a', 'b', 'c', 'a', 'b', 'c']}
series = pd.Series(data)

# nunique() の実行
nunique_counts = series.nunique()

# 結果の表示
print(nunique_counts)
Output:

A    3
B    3
dtype: int64

説明

  • 結果として、A 列には 3 つの重複していない値 (1, 2, 4) があり、B 列には 3 つの重複していない値 (a, b, c) があることがわかります。
  • nunique() 関数は series オブジェクトに適用され、各列の重複していない要素の個数を示す新しい Series オブジェクト nunique_counts が返されます。
  • このコードは、data という辞書を定義し、それを Series オブジェクト series に変換します。

例 2:欠損値の処理

この例では、欠損値 (NaN) を含む Series オブジェクトを作成し、dropna 引数を使用して nunique() 関数の動作を調べます。

import pandas as pd

# データの作成
data = {'A': [1, 2, 3, 1, 2, np.nan],
        'B': ['a', 'b', 'c', 'a', 'b', np.nan]}
series = pd.Series(data)

# nunique() の実行 (デフォルトの dropna=True)
nunique_counts = series.nunique()

# 結果の表示
print(nunique_counts)
Output:

A    2
B    2
dtype: int64
# nunique() の実行 (dropna=False)
nunique_counts_with_nan = series.nunique(dropna=False)

# 結果の表示
print(nunique_counts_with_nan)
Output:

A    3
B    3
dtype: int64

説明

  • 2 番目の nunique() の呼び出しでは、dropna 引数が False に設定されているため、欠損値 (NaN) が含まれ、結果として A 列には 3 つの値 (1, 2, NaN) 、B 列には 3 つの値 (a, b, NaN) があることがわかります。
  • 最初の nunique() の呼び出しでは、dropna 引数がデフォルトの True に設定されているため、欠損値 (NaN) は除外され、結果として A 列には 2 つの重複していない値 (1, 2) 、B 列には 2 つの重複していない値 (a, b) があることがわかります。
  • このコードは、np.nan を含む値を A 列と B 列に追加した data 辞書を定義します。

この例では、異なるデータ型の Series オブジェクトを作成し、nunique() 関数の動作を調べます。

import pandas as pd

# データの作成
data = {'A': [1, 2, 3, 1, 2, 4],
        'B': ['a', 'b', 'c', 'a', 'b', 'Z'],
        'C': [True, False, True, True, False, True]}
series = pd.Series(data)

# nunique() の実行
nunique_counts = series.nunique()

# 結果の表示
print(nunique_counts)
Output:

A    4
B    3
C    2
dtype: int64
  • nunique() 関数は series オブジェクトに適用され、各列の重複していない要素の個数を
  • このコードは、int 型、str 型、bool 型の値を含む data 辞書を定義します。


value_counts() メソッド

value_counts() メソッドは、各値の出現回数をカウントする Series オブジェクトを返します。重複していない要素の数を取得するには、value_counts() の結果のインデックスの長さを調べることができます。

import pandas as pd

# データの作成
data = {'A': [1, 2, 3, 1, 2, 4],
        'B': ['a', 'b', 'c', 'a', 'b', 'c']}
series = pd.Series(data)

# value_counts() の実行
value_counts = series.value_counts()

# 重複していない要素数の取得
nunique_counts = len(value_counts.index)

# 結果の表示
print(nunique_counts)
Output:

3

利点

  • 各値の出現回数も確認できます。
  • 欠損値 (NaN) の扱い方が柔軟です。デフォルトでは NaN はカウントされませんが、dropna 引数を False に設定することでカウントできます。

欠点

  • 重複していない要素のみを抽出する機能はありません。
  • nunique() よりも処理速度が遅い場合があります。

len() 関数と unique() メソッドの組み合わせ

len() 関数と unique() メソッドを組み合わせて、重複していない要素の数を取得することもできます。

import pandas as pd

# データの作成
data = {'A': [1, 2, 3, 1, 2, 4],
        'B': ['a', 'b', 'c', 'a', 'b', 'c']}
series = pd.Series(data)

# unique() メソッドの実行
unique_values = series.unique()

# 重複していない要素数の取得
nunique_counts = len(unique_values)

# 結果の表示
print(nunique_counts)
Output:

3

利点

  • シンプルで分かりやすいコードです。

欠点

  • value_counts() よりも処理速度が遅い場合があります。
  • 欠損値 (NaN) の扱い方が不透明です。デフォルトでは NaN は除外されますが、dropna 引数を設定するオプションはありません。

カスタム関数

特定のニーズに合致する代替手段がない場合は、カスタム関数を作成することができます。以下に、簡単な例を示します。

def count_nunique(series):
    """
    Series オブジェクト内の重複していない要素の数をカウントする関数

    Args:
        series (pd.Series): カウント対象の Series オブジェクト

    Returns:
        int: 重複していない要素の数
    """
    seen_values = set()
    nunique_count = 0
    for value in series:
        if value not in seen_values:
            seen_values.add(value)
            nunique_count += 1
    return nunique_count

# データの作成
data = {'A': [1, 2, 3, 1, 2, 4],
        'B': ['a', 'b', 'c', 'a', 'b', 'c']}
series = pd.Series(data)

# カスタム関数の実行
nunique_counts = count_nunique(series)

# 結果の表示
print(nunique_counts)
Output:

3

利点

  • 完全な制御が可能で、独自のロジックを実装できます。

欠点

  • 処理速度が遅くなる可能性があります。
  • コードが複雑になり、メンテナンスが難しくなる可能性があります。

pandas.Series.nunique() は、多くの場合、Series オブジェクト内の重複していない要素数をカウントするための最速で最も簡単な方法です。しかし、欠損値の処理や処理速度などの要件によっては、上記の代替方法の方が適切な場合があります。状況に応じて最良のツールを選択することが重要です。

  • [Pandas 公式ドキュメント: