DataFrameの列やSeriesの中に含まれているデータにおいて、ユニークな値がどれなのか、それぞれの値がどれくらい含まれているのかを調べる方法をまとめて行きます。

この記事では

  • unique関数の使い方

について解説します。

使用するPandasのバージョンは0.23.3です。

In [1]: import pandas as pd

In [2]: pd.__version__
Out[2]: '0.23.3'

以下のコードでは次のcsvファイルをサンプルファイルとして扱います。

name,age,state,id
Satoh,32,Kanagawa,1021
Takahashi,28,NaN,2152
Egawa,NaN,Ohsaka,1432
Maeda,25,Hiroshima,1104
Satoh,29,Ohsaka,2413
Egawa,32,Kanagawa,NaN

あえて値にNaN値を入れました。

今回使用するこのCSVをsample_unique.csvの名前で保存します。以下のリンクから保存することができます。

sample_unique.csv

SeriesやIndexのユニークな値を調べる

ユニークな値を調べる時はunique関数を使うのが定石です。最初にSeriesとIndexのメンバ関数になっているunique関数の使い方についてみていきます。

APIドキュメントは引数を特に必要としない関数なので省略します。

注意しなければならないのはこれらの関数は DataFrame単体には使えない ということで、SeriesオブジェクトかDataFrameの各々の列、もしくはIndexオブジェクトに対して関数を実行する必要があります。

pd.Series.unique()

まずは先ほどのサンプルファイルsample_unique.csvを読み込みます。

In [5]: sample = pd.read_csv("sample_unique.csv", index_col=0)

In [6]: sample
Out[6]:
            age      state      id
name                              
Satoh      32.0   Kanagawa  1021.0
Takahashi  28.0        NaN  2152.0
Egawa       NaN     Ohsaka  1432.0
Maeda      25.0  Hiroshima  1104.0
Satoh      29.0     Ohsaka  2413.0
Egawa      32.0   Kanagawa     NaN

先ほども触れましたが、DataFrameに対しては関数は使えません。

In [7]: sample.unique() # DataFrameそのものに対しては実行ができない
---------------------------------------------------------------------------
(エラーメッセージが表示される)
AttributeError: 'DataFrame' object has no attribute 'unique'

では1つの列ごとにユニークな値を抜き出していきます。

In [8]: sample["age"].unique()
Out[8]: array([32., 28., nan, 25., 29.])

In [9]: sample["state"].unique()
Out[9]: array(['Kanagawa', nan, 'Ohsaka', 'Hiroshima'], dtype=object)

In [10]: sample["id"].unique()
Out[10]: array([1021., 2152., 1432., 1104., 2413.,   nan])

欠損値が含まれていると、それもユニークな値としてカウントされます。

ここで気づいたかたもいると思いますが、出力される値はソートされません 。ソートした結果が欲しい場合、出力がNumPyのndarrayなのでNumPyのsortメソッドを使用します。

In [18]: import numpy as np

In [20]: a = sample["age"].unique()

In [22]: np.sort(a)
Out[22]: array([25., 28., 29., 32., nan])

pandas.Index.unique()

次に、Indexの値に対して実行していきます。
ここから先に使われているのはpandas.Index.unique()関数の方です。

In [24]: sample.index.unique()
Out[24]: Index(['Satoh', 'Takahashi', 'Egawa', 'Maeda'], dtype='object', name='name')

様々な1次元データに対してユニークな値を調べる

一方、pd.unique()関数の方は引数に入れられた1次元データのユニークな値を抽出してくれます。リストやタプルの形式でもユニークな値を抽出してくれます。

In [25]: pd.unique([0,1,2,2,1])
Out[25]: array([0, 1, 2])

In [26]: pd.unique((1,0,1,1,0,2))
Out[26]: array([1, 0, 2])

In [27]: pd.unique(["Satou","Satou","Arakawa","Takahashi"])
Out[27]: array(['Satou', 'Arakawa', 'Takahashi'], dtype=object)

先ほどのDataFrameの列データやインデックスに対してももちろん有効です。

In [27]: pd.unique(["Satou","Satou","Arakawa","Takahashi"])
Out[27]: array(['Satou', 'Arakawa', 'Takahashi'], dtype=object)

In [28]: pd.unique(sample["age"])
Out[28]: array([32., 28., nan, 25., 29.])

In [29]: pd.unique(sample["state"])
Out[29]: array(['Kanagawa', nan, 'Ohsaka', 'Hiroshima'], dtype=object)

In [30]: pd.unique(sample["id"])
Out[30]: array([1021., 2152., 1432., 1104., 2413.,   nan])

In [31]: pd.unique(sample.index)
Out[31]: array(['Satoh', 'Takahashi', 'Egawa', 'Maeda'], dtype=object)

まとめ

今回はDataFrameの列データやSeries、Indexオブジェクトからユニークな値を抜き出す方法を紹介しました。

この操作はuniqueと名のつく関数でやれば簡単に出来ることがわかりました。出力された値がソートされていないことに注意して使っていきましょう。

参考