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 公式ドキュメント: