(1時間4,000円の伴走型ビデオチャット指導も受付中!)
PythonのPandasで重複を取り除く「unique()」メソッドの徹底解説
![]()
【Hiroki】
Yukiさん、こんにちは!
最近、Pandasを使ってデータの集計を練習しているのですが、データセットの中にある「特定の列にどんな種類のデータが入っているのか」をパッと確認したい時があるんです。
例えば、ユーザーリストから「居住地」の種類だけを重複なしで取り出したい、といった場合です。
何か良い方法はありませんか?
![]()
【Yuki】
Hirokiくん、こんにちは。
データの分析をしていると、そういった場面は本当によくありますよね。
データの種類を重複なく抽出したい時には、Pandasの unique() というメソッドを使うのが一番スマートだと思います。
このメソッドを使うと、指定したデータの中からユニーク(一意)な値だけを取り出すことができるんですよ。
![]()
【Hiroki】
「ユニーク」というのは、重複がないっていう意味ですね。
具体的にどうやって使うのか、教えていただけますか?
![]()
【Yuki】
はい。まずは unique() メソッドの基本的な考え方 から一緒に見ていきましょう。
少し地味な機能に見えるかもしれませんが、データの全体像を把握したり、入力ミスがないかチェックしたりするのに、とても強力な味方になってくれるはずです。
unique()メソッドの基本的な使い方
![]()
【Yuki】
まずは、PandasのSeries(シリーズ)に対して unique() を使う方法が最も一般的です。
簡単なサンプルコードを書いてみますね。
夜に静かな環境でコードを書いていると、こういったシンプルなメソッドの便利さが身に染みることがあります...。
import pandas as pd
# サンプルデータの作成
data = pd.Series(['東京', '大阪', '東京', '名古屋', '大阪', '福岡'])
# unique()メソッドの実行
unique_values = data.unique()
print(unique_values)
![]()
【Hiroki】
あ、本当ですね!
実行結果を見ると、['東京' '大阪' '名古屋' '福岡'] という感じで、重複していた「東京」や「大阪」が1つずつになっています。
![]()
【Yuki】
そうなんです。
ここで注目してほしいのが、「値が現れた順番」が保持されている ことです。
集合(set)型とは違って、元のデータで最初に出現した順番に並んでいるので、データの流れを追いやすいのが特徴かもしれません。
戻り値の型と性質について
![]()
【Hiroki】
これって、出力された結果はリスト形式なんですか?
見た目はリストっぽいですが...。
![]()
【Yuki】
鋭いですね、Hirokiくん。
実は、unique() が返すのはPython標準のリストではなく、NumPyの ndarray という形式なんです。
NumPyはPandasの土台になっているライブラリなので、高速に処理できるように設計されています。
![]()
【Hiroki】
NumPyの配列なんですね。
もし、どうしても後続の処理でPythonのリストとして扱いたい場合はどうすればいいんでしょう?
![]()
【Yuki】
その場合は、.tolist() メソッドを後ろに繋げてあげれば大丈夫ですよ。
data.unique().tolist() と書けば、扱い慣れたリスト形式に変換できます。
状況に応じて使い分けてみてくださいね。
欠損値(NaN)の扱いについて
![]()
【Hiroki】
もし、データの中に何も入力されていない部分、いわゆる「欠損値」があったらどうなるんですか?
エラーになったりしますか?
![]()
【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】
これを実行すると、結果の中に nan が含まれているのがわかります。
データクレンジング(データの掃除)をする時に、「そもそもデータが入っていない行がどれくらいあるのか」を確認するのにも役立つと思います...。
nunique()メソッドとの違い
![]()
【Hiroki】
似たような名前で nunique() というのも見たことがある気がするのですが、これは何が違うんでしょうか?
![]()
【Yuki】
それはとても大切な質問ですね。
名前に n が付いている通り、nunique() は「ユニークな値の数」を返すメソッド です。
unique() は「中身」を教えてくれますが、nunique() は「何種類あるか」という数字を教えてくれます。
![]()
【Hiroki】
なるほど!
「何があるか」を知りたい時は unique()、「何種類あるか」を知りたい時は nunique() ですね。
![]()
【Yuki】
その通りです。ただ、一つだけ注意点があります。
デフォルトの設定では、nunique() は欠損値(NaN)をカウントに含めない ようになっています。
もし欠損値も1種類として数えたい場合は、dropna=False という引数を渡してあげる必要があるんです。
少しややこしいかもしれませんが、覚えておくとミスを防げるかもしれません。
DataFrameの特定の列に対して使う
![]()
【Hiroki】
実際の業務だと、Series単体よりもDataFrame(表形式)を扱うことの方が多いですよね。
DataFrameの中で使う場合はどうすればいいですか?
![]()
【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】
このように、df['列名'].unique() と記述することで、その列に含まれる固有の値を簡単に取り出すことができます。
私は文房具が好きなので、こういう商品リストの整理などはつい楽しくなってしまいます...。
![]()
【Hiroki】
これなら、大きなデータセットでも「どんな項目があるのか」がすぐに分かりますね。
重複削除(drop_duplicates)との違い
![]()
【Hiroki】
そういえば、重複を消す方法として drop_duplicates() というのも習った記憶があるのですが、これとはどう使い分ければいいんでしょうか?
![]()
【Yuki】
それは素晴らしい着眼点ですね、Hirokiくん。
どちらも重複を扱うものですが、目的が少し違います。
unique():- 主に「値の種類」を抽出するために使います。
- 戻り値はNumPy配列(ndarray)になります。
- Seriesに対して使うのが基本です。
drop_duplicates():- 主に「重複している行を削除して、データを綺麗にする」ために使います。
- 戻り値はPandasのDataFrameやSeriesのままです。
- 表形式の構造を維持したまま、特定の行を消したい時に使います。
![]()
【Yuki】
例えば、重複している行を消した後に、そのまま他の列の計算を続けたい場合は drop_duplicates() を使います。
一方で、単に選択肢のリストを作りたいだけなら unique() の方が手軽、といった感じでしょうか。
value_counts()との比較
![]()
【Hiroki】
だんだん整理できてきました!
もう一つ、value_counts() も似ていませんか?
あれもユニークな値が出てくる気がします。
![]()
【Yuki】
ふふ、Hirokiくんは本当に勉強熱心ですね。
その通り、value_counts() もユニークな値を抽出しますが、あちらは 「どの値が何回出現したか」という頻度 も一緒に計算してくれます。
![]()
【Hiroki】
あ、そうか。unique() は値の一覧だけ。value_counts() はその集計結果まで。
ということですね。
![]()
【Yuki】
はい。単に「何があるか」だけを知りたい時に value_counts() を使うと、計算リソースを少し余分に使ってしまうので、目的が「種類の把握」だけなら unique() を使うのが最も効率的だと言われています。
特にデータが数百万件、数千万件とある場合は、小さな差が効いてくるかもしれません。
実践的な活用シーン
![]()
【Hiroki】
具体的に、どんな時に unique() を使うと便利なのか、もう少しイメージを膨らませたいです。
![]()
【Yuki】
そうですね...。
例えば、機械学習のモデルを作る前に、カテゴリ変数の値を確認する時によく使います。
「性別」という列に ['男性', '女性', '不明'] 以外の変な文字列(例えば入力ミスの ['男成'] など)が混じっていないかを確認したりします。
あとは、Webデザインの仕事などで、ユーザーの属性に合わせてフィルター機能を実装する際、そのフィルターの選択肢を動的に生成するために、データベースから抽出したユニークな値を unique() で取得することもありますね。
![]()
【Hiroki】
なるほど!データの不備を見つけたり、インターフェースの項目を作ったりするのに役立つんですね。
まとめ
![]()
【Yuki】
今日は unique() メソッドについて詳しく見てきましたが、いかがでしたか?
![]()
【Hiroki】
すごくよく分かりました!
- 重複のない値の一覧を返してくれる。
- 戻り値はNumPyのndarray形式。
- 欠損値(NaN)も1つの値として含まれる。
- データの種類を確認するのに最適。
というポイントが特に勉強になりました。
![]()
【Yuki】
完璧なまとめです、Hirokiくん。
Pandasにはたくさんの機能がありますが、この unique() は基本中の基本でありながら、ずっと使い続ける大切なツールです。
ぜひ、これからのデータ分析に活用してみてくださいね。
もし、もっと詳しいパラメータや挙動が気になったら、公式ドキュメントも覗いてみると新しい発見があるかもしれません。
pandas.Series.unique — pandas 2.2.2 documentation pandas.unique — pandas 2.2.2 documentation
![]()
【Hiroki】
ありがとうございます!
さっそく自分のデータで試してみようと思います。
![]()
【Yuki】
はい、応援しています。
何かわからないことがあれば、いつでも聞いてくださいね。
夜はまだ長いですし、ゆっくり自分のペースで進めていきましょう...。
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。
初心者から始められるPythonレッスン
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

