mei_13のPython講座 ロゴ

【解説】PythonのPandasで重複を取り除く「unique()」メソッドの徹底解説




🐍 初心者歓迎!月額4,000円で質問し放題のPython講座
(1時間4,000円の伴走型ビデオチャット指導も受付中!)
🚀 講座の詳細を見る 📩 質問・お問い合わせ

PythonのPandasで重複を取り除く「unique()」メソッドの徹底解説


Hirokiのアイコン
【Hiroki】 Yukiさん、こんにちは! 最近、Pandasを使ってデータの集計を練習しているのですが、データセットの中にある「特定の列にどんな種類のデータが入っているのか」をパッと確認したい時があるんです。 例えば、ユーザーリストから「居住地」の種類だけを重複なしで取り出したい、といった場合です。 何か良い方法はありませんか?


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。 データの分析をしていると、そういった場面は本当によくありますよね。 データの種類を重複なく抽出したい時には、Pandasの unique() というメソッドを使うのが一番スマートだと思います。 このメソッドを使うと、指定したデータの中からユニーク(一意)な値だけを取り出すことができるんですよ。


Hirokiのアイコン
【Hiroki】 「ユニーク」というのは、重複がないっていう意味ですね。 具体的にどうやって使うのか、教えていただけますか?


Yukiのアイコン
【Yuki】 はい。まずは unique() メソッドの基本的な考え方 から一緒に見ていきましょう。 少し地味な機能に見えるかもしれませんが、データの全体像を把握したり、入力ミスがないかチェックしたりするのに、とても強力な味方になってくれるはずです。

unique()メソッドの基本的な使い方


Yukiのアイコン
【Yuki】 まずは、PandasのSeries(シリーズ)に対して unique() を使う方法が最も一般的です。 簡単なサンプルコードを書いてみますね。 夜に静かな環境でコードを書いていると、こういったシンプルなメソッドの便利さが身に染みることがあります...。

import pandas as pd

# サンプルデータの作成
data = pd.Series(['東京', '大阪', '東京', '名古屋', '大阪', '福岡'])

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

print(unique_values)


Hirokiのアイコン
【Hiroki】 あ、本当ですね! 実行結果を見ると、['東京' '大阪' '名古屋' '福岡'] という感じで、重複していた「東京」や「大阪」が1つずつになっています。


Yukiのアイコン
【Yuki】 そうなんです。 ここで注目してほしいのが、「値が現れた順番」が保持されている ことです。 集合(set)型とは違って、元のデータで最初に出現した順番に並んでいるので、データの流れを追いやすいのが特徴かもしれません。

戻り値の型と性質について


Hirokiのアイコン
【Hiroki】 これって、出力された結果はリスト形式なんですか? 見た目はリストっぽいですが...。


Yukiのアイコン
【Yuki】 鋭いですね、Hirokiくん。 実は、unique() が返すのはPython標準のリストではなく、NumPyの ndarray という形式なんです。 NumPyはPandasの土台になっているライブラリなので、高速に処理できるように設計されています。


Hirokiのアイコン
【Hiroki】 NumPyの配列なんですね。 もし、どうしても後続の処理でPythonのリストとして扱いたい場合はどうすればいいんでしょう?


Yukiのアイコン
【Yuki】 その場合は、.tolist() メソッドを後ろに繋げてあげれば大丈夫ですよ。 data.unique().tolist() と書けば、扱い慣れたリスト形式に変換できます。 状況に応じて使い分けてみてくださいね。

欠損値(NaN)の扱いについて


Hirokiのアイコン
【Hiroki】 もし、データの中に何も入力されていない部分、いわゆる「欠損値」があったらどうなるんですか? エラーになったりしますか?


Yukiのアイコン
【Yuki】 いえ、エラーにはなりませんので安心してください。 Pandasの unique() は、欠損値(NaN)も一つのユニークな値として扱います。 実際にどう見えるか試してみましょう。

import pandas as pd
import numpy as np

# NaNを含むデータの作成
data_with_nan = pd.Series(['Apple', 'Orange', np.nan, 'Apple', 'Banana', np.nan])

# unique()の実行
print(data_with_nan.unique())


Yukiのアイコン
【Yuki】 これを実行すると、結果の中に nan が含まれているのがわかります。 データクレンジング(データの掃除)をする時に、「そもそもデータが入っていない行がどれくらいあるのか」を確認するのにも役立つと思います...。

nunique()メソッドとの違い


Hirokiのアイコン
【Hiroki】 似たような名前で nunique() というのも見たことがある気がするのですが、これは何が違うんでしょうか?


Yukiのアイコン
【Yuki】 それはとても大切な質問ですね。 名前に n が付いている通り、nunique() は「ユニークな値の数」を返すメソッド です。 unique() は「中身」を教えてくれますが、nunique() は「何種類あるか」という数字を教えてくれます。


Hirokiのアイコン
【Hiroki】 なるほど! 「何があるか」を知りたい時は unique()、「何種類あるか」を知りたい時は nunique() ですね。


Yukiのアイコン
【Yuki】 その通りです。ただ、一つだけ注意点があります。 デフォルトの設定では、nunique() は欠損値(NaN)をカウントに含めない ようになっています。 もし欠損値も1種類として数えたい場合は、dropna=False という引数を渡してあげる必要があるんです。 少しややこしいかもしれませんが、覚えておくとミスを防げるかもしれません。

DataFrameの特定の列に対して使う


Hirokiのアイコン
【Hiroki】 実際の業務だと、Series単体よりもDataFrame(表形式)を扱うことの方が多いですよね。 DataFrameの中で使う場合はどうすればいいですか?


Yukiのアイコン
【Yuki】 DataFrameの場合は、特定の列を抽出してから unique() を呼び出すのが一般的です。 例えば、商品の売上データのようなものを想像してみてください。

import pandas as pd

# サンプルのDataFrame作成
df = pd.DataFrame({
    '商品名': ['ノート', 'ペン', 'ノート', '消しゴム', 'ペン'],
    '価格': [100, 50, 100, 80, 50],
    'カテゴリ': ['文房具', '文房具', '文房具', '文房具', '文房具']
})

# 「商品名」列のユニークな値を取得
unique_items = df['商品名'].unique()

print(f"取り扱い商品一覧: {unique_items}")


Yukiのアイコン
【Yuki】 このように、df['列名'].unique() と記述することで、その列に含まれる固有の値を簡単に取り出すことができます。 私は文房具が好きなので、こういう商品リストの整理などはつい楽しくなってしまいます...。


Hirokiのアイコン
【Hiroki】 これなら、大きなデータセットでも「どんな項目があるのか」がすぐに分かりますね。

重複削除(drop_duplicates)との違い


Hirokiのアイコン
【Hiroki】 そういえば、重複を消す方法として drop_duplicates() というのも習った記憶があるのですが、これとはどう使い分ければいいんでしょうか?


Yukiのアイコン
【Yuki】 それは素晴らしい着眼点ですね、Hirokiくん。 どちらも重複を扱うものですが、目的が少し違います。

  • unique():

    • 主に「値の種類」を抽出するために使います。
    • 戻り値はNumPy配列(ndarray)になります。
    • Seriesに対して使うのが基本です。
  • drop_duplicates():

    • 主に「重複している行を削除して、データを綺麗にする」ために使います。
    • 戻り値はPandasのDataFrameやSeriesのままです。
    • 表形式の構造を維持したまま、特定の行を消したい時に使います。


Yukiのアイコン
【Yuki】 例えば、重複している行を消した後に、そのまま他の列の計算を続けたい場合は drop_duplicates() を使います。 一方で、単に選択肢のリストを作りたいだけなら unique() の方が手軽、といった感じでしょうか。

value_counts()との比較


Hirokiのアイコン
【Hiroki】 だんだん整理できてきました! もう一つ、value_counts() も似ていませんか? あれもユニークな値が出てくる気がします。


Yukiのアイコン
【Yuki】 ふふ、Hirokiくんは本当に勉強熱心ですね。 その通り、value_counts() もユニークな値を抽出しますが、あちらは 「どの値が何回出現したか」という頻度 も一緒に計算してくれます。


Hirokiのアイコン
【Hiroki】 あ、そうか。unique() は値の一覧だけ。value_counts() はその集計結果まで。 ということですね。


Yukiのアイコン
【Yuki】 はい。単に「何があるか」だけを知りたい時に value_counts() を使うと、計算リソースを少し余分に使ってしまうので、目的が「種類の把握」だけなら unique() を使うのが最も効率的だと言われています。 特にデータが数百万件、数千万件とある場合は、小さな差が効いてくるかもしれません。

実践的な活用シーン


Hirokiのアイコン
【Hiroki】 具体的に、どんな時に unique() を使うと便利なのか、もう少しイメージを膨らませたいです。


Yukiのアイコン
【Yuki】 そうですね...。 例えば、機械学習のモデルを作る前に、カテゴリ変数の値を確認する時によく使います。 「性別」という列に ['男性', '女性', '不明'] 以外の変な文字列(例えば入力ミスの ['男成'] など)が混じっていないかを確認したりします。

あとは、Webデザインの仕事などで、ユーザーの属性に合わせてフィルター機能を実装する際、そのフィルターの選択肢を動的に生成するために、データベースから抽出したユニークな値を unique() で取得することもありますね。


Hirokiのアイコン
【Hiroki】 なるほど!データの不備を見つけたり、インターフェースの項目を作ったりするのに役立つんですね。

まとめ


Yukiのアイコン
【Yuki】 今日は unique() メソッドについて詳しく見てきましたが、いかがでしたか?


Hirokiのアイコン
【Hiroki】 すごくよく分かりました! - 重複のない値の一覧を返してくれる。 - 戻り値はNumPyのndarray形式。 - 欠損値(NaN)も1つの値として含まれる。 - データの種類を確認するのに最適。 というポイントが特に勉強になりました。


Yukiのアイコン
【Yuki】 完璧なまとめです、Hirokiくん。 Pandasにはたくさんの機能がありますが、この unique() は基本中の基本でありながら、ずっと使い続ける大切なツールです。 ぜひ、これからのデータ分析に活用してみてくださいね。

もし、もっと詳しいパラメータや挙動が気になったら、公式ドキュメントも覗いてみると新しい発見があるかもしれません。

pandas.Series.unique — pandas 2.2.2 documentation pandas.unique — pandas 2.2.2 documentation


Hirokiのアイコン
【Hiroki】 ありがとうございます! さっそく自分のデータで試してみようと思います。


Yukiのアイコン
【Yuki】 はい、応援しています。 何かわからないことがあれば、いつでも聞いてくださいね。 夜はまだ長いですし、ゆっくり自分のペースで進めていきましょう...。



< 複数の戻り値
コラム一覧に戻る
Pillow >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
4,000円/60分伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

📩 質問・お問い合わせはこちら



AIアシスタント Yuki