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
の名前で保存します。以下のリンクから保存することができます。
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
と名のつく関数でやれば簡単に出来ることがわかりました。出力された値がソートされていないことに注意して使っていきましょう。
参考
- Python for Data Analysis 2nd edition –Wes McKinney(書籍)
- pandas.Series.unique — pandas 0.23.3 documentation
- pandas.unique — pandas 0.23.3 documentation