大量のデータをそのまま見ると、どのような種類の値があるかがわかりにくいです。このような時、ユニークな値を確認することで、データの種類を把握しやすくなります。
具体例で確認しましょう。
惣菜店の販売履歴を表した以下のdf
を使います。
Date | Item | Num | |
---|---|---|---|
0 | 2022/04/02 | 弁当A | 2 |
1 | 2022/04/02 | 中華B | 3 |
2 | 2022/04/03 | 中華B | 1 |
3 | 2022/04/03 | 弁当A | 4 |
4 | 2022/04/03 | サラダ | 2 |
ある列のユニークな値は、下記のように取得します。
df.列名.unique()
たとえば、列Item
のユニークな値は、以下のようになります。
df.Item.unique()
実行結果
array(['弁当A', '中華B', 'サラダ'], dtype=object)
結果は、多次元配列型になります。ここでは、リストのようなものと思ってください。
実行結果を確認すると、列Item
に含まれる値が重複なく取得できていることがわかります(弁当A
、中華B
、サラダ
)。
演習
import pandas as pd df = pd.DataFrame({ "Date": ["2022/04/02", "2022/04/02", "2022/04/03", "2022/04/03", "2022/04/03"], "Item": ["弁当A", "中華B", "中華B", "弁当A", "サラダ"], "Num": [2, 3, 1, 4, 2], }) df
Out[1]:
Date | Item | Num | |
---|---|---|---|
0 | 2022/04/02 | 弁当A | 2 |
1 | 2022/04/02 | 中華B | 3 |
2 | 2022/04/03 | 中華B | 1 |
3 | 2022/04/03 | 弁当A | 4 |
4 | 2022/04/03 | サラダ | 2 |
今回扱うデータには、2022/04/02
と2022/04/03
の2日間の販売履歴が含まれています。実際に、列Date
が2日分かどうかを確認しましょう。 ユニークな値は、列のunique()
で取得できます。まとめて二つの項目はチェックできない。
df.Date.unique()
df[["Date","Num"]].unique()は出来ない。
array(['2022/04/02', '2022/04/03'], dtype=object)
続いて、列Item
のユニークな値を確認してみましょう。 結果を確認すると、3種類の商品が売れたことがわかります。
df.Item.unique()
Out[3]:
array(['弁当A', '中華B', 'サラダ'], dtype=object)
DataFrameとSeriesのメソッドの多くは共通で存在しますが、unique()
はSeriesのみ存在します。DataFrameには存在しないので、下記のコメントを外して実行するとAttributeErrorになります。 また、下記のコメントを外したままだと、判定は通りません。AttributeErrorになることを確認したら、再度コメントアウトしてから判定を行ってください。In [4]:
# df.unique()
nunique()について
本問では、ユニークな値をunique()
メソッドで取得しました。これに対し、ユニークな値の件数はnunique()
メソッドで取得できます。名前がよく似ていますが、n
がついています。これはnumber
のn
です。
このメソッドを使うと、各列に重複した値が存在するかどうかの確認ができます(欠損値は無視します)。
具体例で確認しましょう。写経で扱ったdf
では、全ての列で重複があります。そのため、次のように列Num
の要素が重複しないデータを作成して確認してみます。
df2 = df[:4]
df2
Date | Item | Num | |
---|---|---|---|
0 | 2022/04/02 | 弁当A | 2 |
1 | 2022/04/02 | 中華B | 3 |
2 | 2022/04/03 | 中華B | 1 |
3 | 2022/04/03 | 弁当A | 4 |
重複していなければ、ユニークな値の数(nunique()
)と個数(count()
)が等しくなります。下記の式で確認できます。このようなSeries同士の比較結果は、要素がブール値のSeriesになります。
df2.nunique() == df2.count()
実行結果
Date False
Item False
Num True
dtype: bool
列Num
は重複がないので、Trueになります。
上記では、DataFrame.nunique()
を使いましたが、Series.nunique()
も使えます。
たとえば、列Num
に重複している値があるかどうかは、下記でわかります。
df2.Num.nunique() == df2.Num.count()
実行結果
True
コメント