【解説】手を動かしながらカウント(len関数、uniqueメソッド)を学ぶ | データサイエンス100本ノック【問21〜問22 回答】

【解説】手を動かしながらカウント(len関数、uniqueメソッド)を学ぶ | データサイエンス100本ノック【問21〜問22 回答】

当ページのリンクには広告が含まれています。




目次

この記事の対象者


・ データサイエンティストを目指している人

本記事で学ぶpythonのメソッド



本記事では以下3つのメソッドを学びます

  • リストの数や文字列の長さを数える関数
  • 重複を除いた件数(ユニーク件数)を数えるメソッド

以降それぞれの内容についてまとめていきます。

リストの数や文字列の長さを数えるlen()関数

len()関数はオブジェクトの長さや要素の数を取得するときに使用します。

len()関数の引数には、str型とlist型を使うことが出来ますが、int型、floot型、bool型などは使用できません。

len()の使い方
1
2
len("python") # 「6」と出力される
len([1, 2, 3]) # 「3」と出力される

重複を除いた件数(ユニーク件数)を数えるunique()メソッド

重複を除いた件数であるユニーク件数を数えるメソッドは、unique()と書きます。

例えば、以下のようなデータフレームがあったとします。



column 1 column 2
1 12 a
2 3 b
3 46 a
4 61 b

このデータフレームのcolumn 2に対してユニーク件数を調べるとします。

要素の数自体は4つありますが、存在するアルファベットは2つなので、ユニーク数は2となります。

注意しなければならないのは、unique()メソッドはDataFrame単体には使えないということです。

つまり、2次元のデータに対してunique()メソッドは使うことが出来ないということです。

データフレーム、二次元のデータ、という言葉が「?」という方のために、改めてPandasにおける基本的なデータ構造についておさらいします。

Pnadasには、SeriesとDataFrameという2種類のデータ構造が存在します。

主に使われるデータ構造は2次元のデーブルで表されるDataFrameで、横方向のデータを行、縦方向のデータを列と呼びます。

各行、各列に対してそれぞれラベルが付けられており、行ラベルはインデックス、列ラベルはカラムといいます。

Seriesは1次元の配列で、DataFrameの行または列として捉えることができます。

こちらも同様にラベルが付いています。

実際に手を動かしながらlen()unique()を使ってみよう

早速問題を解いてみよう!

実際にlen()unique()を使ってみましょう。

以降は、一般社団法人データサイエンティスト協会がGitHubに公開している「データサイエンス100本ノック」の21問目〜22問目を題材にしています。

データサイエンス100本ノックの環境構築方法は以下の記事にまとめていますので、こちらを参照してください

第21問目: len関数

P-021: レシート明細データフレーム(df_receipt)に対し、件数をカウントせよ。

まずは、レシート明細データフレーム(df_receipt)の全体像を確認しましょう。

1
df_receipt
出力
1
2
3
4
5
6
7
8
9
10
11
12
13

sales_ymd sales_epoch store_cd receipt_no receipt_sub_no customer_id product_cd quantity amount
0 20181103 1541203200 S14006 112 1 CS006214000001 P070305012 1 158
1 20181118 1542499200 S13008 1132 2 CS008415000097 P070701017 1 81
2 20170712 1499817600 S14028 1102 1 CS028414000014 P060101005 1 170
3 20190205 1549324800 S14042 1132 1 ZZ000000000000 P050301001 1 25
4 20180821 1534809600 S14025 1102 2 CS025415000050 P060102007 1 90
... ... ... ... ... ... ... ... ... ...
104676 20180221 1519171200 S13043 1132 2 ZZ000000000000 P050101001 1 40
104677 20190911 1568160000 S14047 1132 2 ZZ000000000000 P071006005 1 218
104678 20170311 1489190400 S14040 1122 1 CS040513000195 P050405003 1 168
104679 20170331 1490918400 S13002 1142 1 CS002513000049 P060303001 1 148
104680 20190423 1555977600 S13016 1102 2 ZZ000000000000 P050601001 1 138

以下のようにlen関数を用いて、レシート明細データフレーム(df_receipt)の件数をカウントすることができます。

1
len(df_receipt)
出力
1
104681

第22問目: unique()メソッド

P-022: レシート明細データフレーム(df_receipt)の顧客ID(customer_id)に対し、ユニーク件数をカウントせよ。

問題の記述通りcustomer_idを列指定しましょう。

1
df_receipt[["customerid"]]
出力
1
2
3
4
5
6
7
8
9
10
11
12
13
14

customer_id
0 CS006214000001
1 CS008415000097
2 CS028414000014
3 ZZ000000000000
4 CS025415000050
... ...
104676 ZZ000000000000
104677 ZZ000000000000
104678 CS040513000195
104679 CS002513000049
104680 ZZ000000000000
104681 rows × 1 columns

len関数を用いて件数を確認します。

1
len(df_receipt[["customer_id"]])
出力
1
104681

ここで、unique()メソッドを使って、ユニーク件数をカウントします。

1
len(df_receipt[["customer_id"]].unique())

以下のようなエラーが出力されるかと思います。

出力
1
2
3
4
5
6
7
8
9
10
11
12
13
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-75-317f9e4b944f> in <module>
----> 1 len(df_receipt[["customer_id"]].unique())

/opt/conda/lib/python3.8/site-packages/pandas/core/generic.py in __getattr__(self, name)
5460 if self._info_axis._can_hold_identifiers_and_holds_name(name):
5461 return self[name]
-> 5462 return object.__getattribute__(self, name)
5463
5464 def __setattr__(self, name: str, value) -> None:

AttributeError: 'DataFrame' object has no attribute 'unique'

Dataframeオブジェクトには、uniqueメソッドは使えません、というエラーであることが分かります。

つまり、データが二次元([[]]というふうに二重リスト)になっているから、uniqueメソッドが使えないということになります。

なので、DataFrameのcustomer_id列の一次元配列であることを明示的に示すために、[]を1つ外します。

1
len(df_receipt["customer_id"].unique())

こうすることで、以下のようにユニーク件数を出力することが出来ます。

出力
1
8307



まとめ: len関数とuniqueメソッドを使えるようになりました。

本記事は、【Python】手を動かしながらカウントを学ぶ | データサイエンス100本ノック【問21〜問22 回答】というテーマでまとめました。

uniqueメソッドは、二次元配列では使用できず、1次元配列でのみ使用できる点に注意しましょう。

>> 続きはこちら

コメント