CSVを読み込んだあと、部署、商品カテゴリ、ステータス のような列を見て、次のように感じることがあります。
「この列には、どんな値が入っているのだろう?」
「カテゴリの種類はいくつあるのだろう?」
「unique()、nunique()、value_counts() のどれを使えばよいのだろう?」
このようなときに役立つのが、Pandasの unique() と nunique() です。
最初に結論を言うと、値の一覧を見たいときは unique()、値の種類数だけ知りたいときは nunique()、値ごとの件数まで見たいときは value_counts() を使います。
この記事では、unique() と nunique() の違い、欠損値の扱い、value_counts() との使い分け、表記ゆれを見つける流れを、Google Colabで試しやすい例で解説します。
特に、集計やグラフ化をする前にカテゴリ列の中身を確認しておくと、表記ゆれや欠損値に早く気づけます。
- 先に結論:3つのメソッドは目的で使い分ける
- この記事でわかること
- 似たメソッドまで含めた使い分け
- サンプルデータを用意する
- unique()で重複を除いた値の一覧を確認する
- nunique()で値の種類数を確認する
- unique()とnunique()の違い
- value_counts()との違い
- 欠損値(NaN / <NA>)がある場合の注意点
- count()とnunique()の違い
- unique()で表記ゆれを見つける
- groupby().nunique()でグループごとの種類数を確認する
- duplicated()やdrop_duplicates()との違い
- よくあるミスと注意点
- データ分析の流れの中でunique()・nunique()を使うタイミング
- まとめ
- 次に読みたい関連記事
先に結論:3つのメソッドは目的で使い分ける
unique()、nunique()、value_counts() は、どれも列の値を確認するときに使います。
ただし、見たいものが違います。
迷ったら、まずはこの基準で選びます。
| 知りたいこと | 使うメソッド | 結果のイメージ |
|---|---|---|
| 値の一覧を見たい | unique() |
営業部、企画部、営業、人事部 |
| 種類数だけ知りたい | nunique() |
4種類 |
| 値ごとの件数を見たい | value_counts() |
営業部が3件、企画部が2件 |
この記事では、この使い分けを実際のDataFrameで確認していきます。
この記事でわかること
この記事では、次の内容を扱います。
unique()で重複を除いた値の一覧を確認する方法nunique()で値の種類数を確認する方法unique()とnunique()の違いvalue_counts()との使い分け- 欠損値がある場合の注意点
count()とnunique()の違い- 表記ゆれ確認での使い方
groupby().nunique()でグループごとの種類数を確認する考え方
この記事のゴールは、unique()・nunique()・value_counts() の違いを理解し、データの中身確認から表記ゆれ・欠損値・集計前の前処理へ進めるようになることです。
似たメソッドまで含めた使い分け
基本は、上の3つを押さえれば十分です。
ここでは、実務で一緒に迷いやすい groupby().nunique() や duplicated() も含めて、少しだけ整理しておきます。
| やりたいこと | 使うメソッド | 例 |
|---|---|---|
| 値の一覧を見たい | unique() |
部署名にどんな値があるか確認する |
| 値の種類数だけ知りたい | nunique() |
部署が何種類あるか数える |
| 値ごとの件数まで知りたい | value_counts() |
営業部が何件、企画部が何件あるか数える |
| グループごとに種類数を知りたい | groupby().nunique() |
部署ごとに商品カテゴリが何種類あるか数える |
| 重複している行そのものを確認したい | duplicated() |
同じ注文行が重複していないか確認する |
unique() と nunique() は、どちらも「重複を除いた値」に関係します。
ただし、返すものが違います。
| メソッド | 返すもの | 使う場面 |
|---|---|---|
unique() |
重複を除いた値の一覧 | どんな値が入っているか見たいとき |
nunique() |
重複を除いた値の個数 | 種類数だけ知りたいとき |
たとえば、部署 の中身を見て「営業部」と「営業」が混ざっていないか確認したいなら unique() が向いています。
一方で、部署が何種類あるかだけ知りたいなら nunique() が向いています。
このあと、まずは主役である unique() と nunique() を実際のDataFrameで確認し、その後で value_counts() や欠損値の扱いとの違いを見ていきます。
サンプルデータを用意する
ここでは、売上データを例にします。
部署、商品カテゴリ、ステータス のようなカテゴリ列を含むDataFrameです。実際のCSVを読み込んだあとにも、同じような確認をすることがよくあります。
このサンプルでは、欠損値を pd.NA で入れています。実際のデータでは、表示上 NaN や <NA> と出ることがありますが、どちらも「値が入っていない状態」として扱います。
import pandas as pd
df = pd.DataFrame({
"注文ID": [101, 102, 103, 104, 105, 106, 107, 108],
"部署": ["営業部", "営業部", "企画部", "営業", "人事部", "企画部", "営業部", pd.NA],
"商品カテゴリ": ["PC", "マウス", "PC", "キーボード", "マウス", "PC", "モニター", "PC"],
"ステータス": ["完了", "完了", "処理中", "完了", "キャンセル", "処理中", "完了", pd.NA],
"売上": [120000, 3000, 150000, 8000, 2500, 140000, 32000, 110000]
})
df
| 注文ID | 部署 | 商品カテゴリ | ステータス | 売上 | |
|---|---|---|---|---|---|
| 0 | 101 | 営業部 | PC | 完了 | 120000 |
| 1 | 102 | 営業部 | マウス | 完了 | 3000 |
| 2 | 103 | 企画部 | PC | 処理中 | 150000 |
| 3 | 104 | 営業 | キーボード | 完了 | 8000 |
| 4 | 105 | 人事部 | マウス | キャンセル | 2500 |
| 5 | 106 | 企画部 | PC | 処理中 | 140000 |
| 6 | 107 | 営業部 | モニター | 完了 | 32000 |
| 7 | 108 | <NA> | PC | <NA> | 110000 |
このデータでは、部署 列に 営業部 と 営業 が混ざっています。
これは、同じ意味の値が別表記で入っている「表記ゆれ」の可能性があります。
このような状態を見つけるためにも、unique() は役立ちます。
unique()で重複を除いた値の一覧を確認する
unique() は、列に含まれる値を重複なしで確認するメソッドです。
まずは、部署 列に入っている値を一覧で確認します。
この結果を見ることで、表記ゆれや欠損値の有無に気づきやすくなります。
df["部署"].unique()
array(['営業部', '企画部', '営業', '人事部', <NA>], dtype=object)
unique() を使うと、部署 列に含まれる値の一覧を確認できます。
この結果を見ると、営業部 と 営業 が別の値として入っていることがわかります。
実際には同じ意味で入力されているなら、あとで replace() などを使って表記をそろえる候補になります。
ここで大事なのは、unique() は元のDataFrameを書き換える処理ではないという点です。
あくまで、列の中にどんな値があるかを確認するためのメソッドです。
下の表では、実際の出力をそのまま貼るのではなく、初心者が読み取りやすいように値の部分だけを整理して示しています。
| 確認した列 | unique()で見える値 |
気づけること |
|---|---|---|
部署 |
営業部, 企画部, 営業, 人事部, <NA> |
営業部 と 営業 が表記ゆれの可能性 |
ステータス |
完了, 処理中, キャンセル, <NA> |
欠損値が含まれていることに気づける |
商品カテゴリ |
PC, マウス, キーボード, モニター |
どの商品カテゴリがあるか確認できる |
このように、unique() は「集計する前に、列の中身をざっと確認する」場面で便利です。
特に、Colab上では array([...], dtype=object) のように表示されることがあります。
これは「値の一覧が配列の形で返っている」という意味なので、初心者のうちは次のように読み替えると十分です。
| Colabで出る表示の一部 | 初心者向けの読み方 |
|---|---|
array([...], dtype=object) |
値の一覧が返っている |
営業部, 企画部, 営業 |
部署 列に入っている値 |
<NA> |
欠損値が含まれている |
dtype=object |
文字列などを含む列として扱われている |
ここでは、dtype=object の細かい意味まで深掘りしなくて大丈夫です。
まずは「どんな値が入っているかを確認できた」と考えれば問題ありません。
unique()の結果はDataFrameではない
unique() の戻り値は、通常のDataFrameではなく、配列のような形で返ってきます。
そのため、表として整えて見たい場合は、必要に応じて pd.Series() に変換して確認することもできます。
pd.Series(df["部署"].unique(), name="部署の値")
| 部署の値 | |
|---|---|
| 0 | 営業部 |
| 1 | 企画部 |
| 2 | 営業 |
| 3 | 人事部 |
| 4 | <NA> |
このようにすると、値の一覧を縦に並べて確認しやすくなります。
ただし、普段の確認では df["列名"].unique() だけでも十分なことが多いです。
nunique()で値の種類数を確認する
nunique() は、重複を除いた値の「個数」を数えるメソッドです。
unique() が「どんな値があるか」を見るのに対して、nunique() は「何種類あるか」を確認します。
次に、値そのものではなく「何種類あるか」だけを確認します。
このときに使うのが nunique() です。
df["部署"].nunique()
4
この結果は、部署 列に含まれる欠損値を除いた種類数です。
ここで注意したいのは、nunique() は標準では欠損値を数えないことです。
欠損値も1種類として数えたい場合は、dropna=False を指定します。
df["部署"].nunique(dropna=False)
5
欠損値を含めて種類数を見たい場合は、dropna=False を使います。
| 確認したいこと | 書き方 | 欠損値の扱い |
|---|---|---|
| 欠損値を除いて種類数を数える | df["部署"].nunique() |
数えない |
| 欠損値も含めて種類数を数える | df["部署"].nunique(dropna=False) |
数える |
データ確認の段階では、まず標準の nunique() で種類数を見て、欠損値も気になる場合に dropna=False を使うと考えるとわかりやすいです。
unique()とnunique()の違い
unique() と nunique() は名前が似ていますが、目的は違います。
| 比較項目 | unique() |
nunique() |
|---|---|---|
| 確認できること | 重複を除いた値の一覧 | 重複を除いた値の個数 |
| 返ってくるもの | 値の並び | 数値 |
| 向いている場面 | 表記ゆれや入力値を確認したいとき | 種類数だけ知りたいとき |
| 欠損値の扱い | 結果に欠損値が出ることがある | 標準では欠損値を数えない |
たとえば、部署 の中身を見て「営業部」と「営業」が混ざっていないか確認したいなら unique() が向いています。
一方で、部署が何種類あるかだけ知りたいなら nunique() が向いています。
value_counts()との違い
unique() や nunique() と一緒に迷いやすいのが、value_counts() です。
value_counts() は、値ごとの件数を数えるメソッドです。
値ごとの件数まで見たい場合は、unique() ではなく value_counts() を使います。
df["部署"].value_counts(dropna=False)
| count | |
|---|---|
| 営業部 | 3 |
| 企画部 | 2 |
| 営業 | 1 |
| 人事部 | 1 |
| <NA> | 1 |
value_counts() を使うと、値の一覧だけでなく、それぞれの値が何件あるかまで確認できます。
| やりたいこと | 使うメソッド | 結果のイメージ |
|---|---|---|
| 値の一覧だけ見たい | unique() |
営業部, 企画部, 営業, 人事部, <NA> |
| 値の種類数だけ知りたい | nunique() |
4 など |
| 値ごとの件数を知りたい | value_counts() |
営業部: 3件, 企画部: 2件 など |
value_counts() はとても便利ですが、この記事では詳しく深掘りしません。
件数集計や割合表示まで確認したい場合は、value_counts() の記事に進むと理解しやすくなります。
関連記事:
pandas value_counts()の使い方|件数集計・割合表示・欠損値の数え方を解説
欠損値(NaN / <NA>)がある場合の注意点
unique() と nunique() では、欠損値の扱いが少し違います。
このサンプルでは pd.NA を使っているため、実行結果では <NA> と表示されます。
CSVから読み込んだデータでは NaN と表示されることもありますが、ここではどちらも「欠損値」として考えます。
ステータス 列で確認してみましょう。
df["ステータス"].unique()
array(['完了', '処理中', 'キャンセル', <NA>], dtype=object)
df["ステータス"].nunique()
3
df["ステータス"].nunique(dropna=False)
4
結果を見ると、unique() では欠損値が結果に出ることがあります。
一方で、nunique() は標準では欠損値を数えません。
| メソッド | 欠損値の扱い |
|---|---|
unique() |
結果に欠損値が含まれることがある |
nunique() |
標準では欠損値を数えない |
nunique(dropna=False) |
欠損値も1種類として数える |
value_counts(dropna=False) |
欠損値の件数も表示できる |
欠損値そのものを詳しく確認したい場合は、isnull() や fillna() とあわせて考えるとよいです。
関連記事:
pandas fillna()の使い方|欠損値を0・平均値・中央値・最頻値で埋める方法を初心者向けに解説
count()とnunique()の違い
ここは補足です。
nunique() と似て見えやすいものに、count() があります。
count() は、欠損値以外のデータ数を数えるメソッドです。
一方、nunique() は、重複を除いた値の種類数を数えます。
同じ 部署 列で、結果の違いだけ確認しておきましょう。
pd.DataFrame({
"確認内容": ["欠損値以外の件数", "値の種類数"],
"使うメソッド": ["count()", "nunique()"],
"結果": [df["部署"].count(), df["部署"].nunique()]
})
| 確認内容 | 使うメソッド | 結果 | |
|---|---|---|---|
| 0 | 欠損値以外の件数 | count() | 7 |
| 1 | 値の種類数 | nunique() | 4 |
count() は、部署 に値が入っている行数を数えます。
nunique() は、部署 に何種類の値があるかを数えます。
つまり、同じ「数える」でも、見ているものが違います。
| メソッド | 数えているもの |
|---|---|
count() |
欠損値以外のデータ数 |
nunique() |
重複を除いた値の種類数 |
カテゴリ列の中身を確認したい場合は、unique() や nunique() の方が目的に合いやすいです。
unique()で表記ゆれを見つける
unique() は、表記ゆれを見つけるときにも役立ちます。
表記ゆれとは、同じ意味の値が少し違う表記で入っている状態です。
たとえば、今回の 部署 列には、次のような値があります。
df["部署"].unique()
array(['営業部', '企画部', '営業', '人事部', <NA>], dtype=object)
この結果を見ると、営業部 と 営業 が別の値として扱われています。
もしこの2つが同じ部署を意味しているなら、集計前に表記をそろえた方がよいです。
| 元データの状態 | unique()で気づけること |
次に考える処理 |
|---|---|---|
営業部 と 営業 が混在 |
表記ゆれの可能性 | replace() で表記をそろえる |
完了 と 完了済み が混在 |
ステータス名の表記ゆれ | ルールを決めて置換する |
PC と パソコン が混在 |
商品カテゴリの表記ゆれ | カテゴリ名を統一する |
ここでは、修正方法を深掘りしすぎないようにします。
表記ゆれを実際に置換する方法は、replace() の記事で詳しく扱うと自然です。
関連記事:
pandas replace()の使い方|値の置換・表記ゆれ・欠損値変換を解説
表記ゆれを軽くそろえてから確認する例
ここでは補足として、営業 を 営業部 にそろえる例だけ見ておきます。
この記事の中心は unique() と nunique() なので、置換処理そのものは深掘りしません。
df_clean = df.copy()
df_clean["部署"] = df_clean["部署"].replace({
"営業": "営業部"
})
df_clean["部署"].unique()
array(['営業部', '企画部', '人事部', <NA>], dtype=object)
表記をそろえたあとに unique() を使うと、営業 がなくなり、営業部 にまとまったことを確認できます。
このように、unique() は「修正する前の確認」と「修正した後の確認」の両方で使えます。
groupby().nunique()でグループごとの種類数を確認する
ここは応用ではなく、「こういう使い方もある」と軽く知っておく程度で大丈夫です。
nunique() は、groupby() と組み合わせることもできます。
たとえば、部署ごとに何種類の商品カテゴリを扱っているかを確認したい場合です。
df_clean.groupby("部署")["商品カテゴリ"].nunique()
| 商品カテゴリ | |
|---|---|
| 人事部 | 1 |
| 企画部 | 1 |
| 営業部 | 4 |
このように、groupby().nunique() を使うと、グループごとの種類数を確認できます。
ただし、この記事では groupby() の詳しい使い方には深入りしません。
集計の考え方を詳しく学びたい場合は、groupby×agg の記事に進むとよいです。
関連記事:
Pandas groupby×aggの使い方|基本の集計とaggの書き方を例で解説
duplicated()やdrop_duplicates()との違い
unique() と混同しやすいものに、duplicated() や drop_duplicates() があります。
| メソッド | 主な目的 | 今回のテーマとの違い |
|---|---|---|
unique() |
重複を除いた値の一覧を確認する | 列の中にどんな値があるかを見る |
nunique() |
重複を除いた値の種類数を数える | 種類数を知りたいときに使う |
duplicated() |
重複している行や値を判定する | 値の一覧や種類数を見る目的ではない |
drop_duplicates() |
重複を除いたDataFrameやSeriesを作る | データの形を残して重複を取り除きたいときに使う |
duplicated() は、重複している行を確認したいときに使います。
今回の記事の中心である unique()・nunique() は、列の値の種類を確認するためのものです。
関連記事:
pandas duplicated()の使い方|重複行の確認・subset・keepを初心者向けに解説
よくあるミスと注意点
ここでは、初心者がつまずきやすいポイントを整理します。
unique()は元のDataFrameを書き換えない
unique() は、重複を除いた値の一覧を確認するメソッドです。
元のDataFrameから重複を削除する処理ではありません。
nunique()は値の一覧ではなく個数を返す
nunique() は、ユニークな値そのものではなく、種類数を返します。
値の中身を確認したい場合は、unique() を使います。
nunique()は標準では欠損値を数えない
欠損値も含めて種類数を確認したい場合は、nunique(dropna=False) を使います。
value_counts()とは目的が違う
value_counts() は、値ごとの件数を見るためのメソッドです。
「一覧」「種類数」「件数」のどれを知りたいかで使い分けましょう。
unique()で表記ゆれを見つけても自動では直らない
unique() は表記ゆれを見つけるために便利ですが、値を自動で修正するわけではありません。
修正が必要な場合は、replace() などの前処理につなげます。
データ分析の流れの中でunique()・nunique()を使うタイミング
unique() と nunique() は、データ確認から前処理へ進むタイミングで役立ちます。
たとえば、次のような流れです。
| ステップ | 使うメソッド | 確認すること |
|---|---|---|
| 1 | head() |
最初の数行を見る |
| 2 | info() |
列名・データ型・欠損値を確認する |
| 3 | describe() |
数値列の概要を見る |
| 4 | unique()・nunique() |
カテゴリ列や文字列列の中身を確認する |
| 5 | replace() |
表記ゆれがあればそろえる |
| 6 | fillna() |
欠損値があれば対応する |
| 7 | value_counts()・groupby() |
必要に応じて集計する |
| 8 | 条件抽出・可視化 | 分析やグラフ化へ進む |
文章で書くと長く見えますが、流れとしては次のイメージです。
データを見る → 値の中身を確認する → 必要なら直す → 集計や可視化へ進む
info() や describe() だけでは、文字列列にどんな値が入っているかまでは見えにくいことがあります。
そのため、カテゴリ列やステータス列では、unique() や nunique() を使って中身を確認することが大切です。
次に読みたい関連記事:
Pandas info()とdescribe()の違い|欠損値・型・統計量の見方を例で解説
まとめ
この記事では、Pandasの unique() と nunique() を使って、重複なしの値と種類数を確認する方法を解説しました。
ポイントを整理します。
unique()は、重複を除いた値の一覧を確認するnunique()は、重複を除いた値の種類数を確認する- 値ごとの件数まで見たい場合は
value_counts()を使う count()は欠損値以外の件数、nunique()は値の種類数を数える- 欠損値も種類数に含めたい場合は
nunique(dropna=False)を使う - 表記ゆれを見つけるときは、まず
unique()で列の値を確認する - グループごとの種類数は
groupby().nunique()で確認できる duplicated()は重複行の確認が目的で、unique()・nunique()とは役割が違う
データ分析では、いきなり集計や可視化に進む前に、列の中にどんな値が入っているかを確認することが大切です。
unique() と nunique() を使えるようになると、表記ゆれ、カテゴリの種類、欠損値の扱いに気づきやすくなり、前処理の精度を上げやすくなります。
次に読みたい関連記事
今回の記事とあわせて読むと、Pandasのデータ確認から前処理・集計までの流れがつかみやすくなります。
Pandas DataFrame入門|作り方・基本操作をわかりやすく解説
DataFrameの基本構造から確認したい方におすすめです。Pandas info()とdescribe()の違い|欠損値・型・統計量の見方を例で解説
データ全体の型・欠損値・統計量を確認したい方におすすめです。pandas value_counts()の使い方|件数集計・割合表示・欠損値の数え方を解説
値ごとの件数や割合まで見たい方におすすめです。pandas replace()の使い方|値の置換・表記ゆれ・欠損値変換を解説
unique()で見つけた表記ゆれを直したい方におすすめです。Pandas groupby×aggの使い方|基本の集計とaggの書き方を例で解説
グループごとの集計を詳しく学びたい方におすすめです。
必要に応じて、欠損値処理は fillna()の記事、重複行の確認は duplicated()の記事、特定の値だけ抽出したい場合は isin()の記事 も参考にしてください。
pandasのunique()は何をするメソッドですか?
unique() は、列に含まれる値を重複なしで確認するメソッドです。
たとえば、部署 列に 営業部、企画部、人事部 など、どんな値が入っているかを確認できます。
unique()とnunique()の違いは何ですか?
unique() は値の一覧を返します。nunique() は値の種類数を返します。
値の中身を見たいときは unique()、何種類あるかだけ知りたいときは nunique() を使います。
unique()とvalue_counts()はどう使い分けますか?
値の一覧だけ見たいときは unique() を使います。
値ごとの件数まで知りたいときは value_counts() を使います。
たとえば、部署名の種類を確認するだけなら unique()、部署ごとの件数まで確認するなら value_counts() が向いています。
nunique()とcount()の違いは何ですか?
count() は、欠損値以外のデータ数を数えます。nunique() は、重複を除いた値の種類数を数えます。
つまり、count() は「何件入っているか」、nunique() は「何種類あるか」を見るためのメソッドです。
nunique()は欠損値を数えますか?
標準の nunique() は、欠損値を数えません。
欠損値も1種類として数えたい場合は、nunique(dropna=False) を使います。
unique()の結果にNaNや<NA>が出るのはなぜですか?
列の中に欠損値が含まれているためです。unique() は、列に含まれる値の一覧を返すため、欠損値が結果に出ることがあります。
CSVから読み込んだデータでは NaN、Pandasの欠損値では <NA> のように表示されることがあります。
複数列に対してunique()は使えますか?
基本的には、まず1列ずつ df["列名"].unique() の形で確認するのがおすすめです。
複数列を一度に確認する方法もありますが、初心者のうちは、列ごとに中身を確認した方が理解しやすいです。
グループごとにユニーク数を数えるにはどうすればよいですか?
groupby().nunique() を使います。
たとえば、部署ごとに商品カテゴリの種類数を確認したい場合は、df.groupby("部署")["商品カテゴリ"].nunique() のように書きます。
表記ゆれの確認にunique()は使えますか?
はい、使えます。unique() で列の値を一覧表示すると、営業部 と 営業、完了 と 完了済み のような表記ゆれに気づきやすくなります。
ただし、unique() は確認するためのメソッドなので、自動で修正するわけではありません。
表記を直す場合は、replace() などの前処理につなげます。
DataFrame全体で列ごとの種類数を確認できますか?
はい、df.nunique() を使うと、各列のユニークな値の数をまとめて確認できます。
たとえば、部署、商品カテゴリ、ステータス など、複数の列について種類数を一度に見たいときに便利です。
ただし、初心者のうちは、まず df["列名"].unique() や df["列名"].nunique() のように、1列ずつ確認する方が理解しやすいです。
この記事では、まず基本として「1列の値を確認する」使い方を中心に扱っています。
コメント