いっきのblog

技術とか色々

DataFrameで特定カラムでユニークに集計する方法

DataFrameで特定カラムでユニークに集計する方法についてのメモ。

利用するデータ

今回利用するデータは、一つのアカウントに対して、複数の本のタイトルが紐づいてるデータとする。

df[['account_id', 'title']]

f:id:kzkohashi:20180828224809p:plain

本のタイトルがいくつ紐づいてるか集計すると以下のようになる。

df.groupby(['title']).agg({'title': 'count'}).sort_values(by='title', ascending=False)

f:id:kzkohashi:20180828224220p:plain

このままだとあるアカウントが同じ本のタイトルに何回も紐づいてしまうため、アカウントごとに同じタイトルの本が複数紐づいてる場合は一つとカウントしたい。

agg関数をうまく使ってユニークにする

若干怪しいところあるけど、とりあえずはこれでできた。

unique_df = df.groupby(['account_id','title']).title.agg(lambda x: x.unique()).to_frame()
unique_df.reset_index(drop=True)
unique_df.groupby('title').agg({'title': 'count'}).sort_values(by='title', ascending=False)

f:id:kzkohashi:20180828224714p:plain

agg関数で集計する際に、値をユニークにしてるがミソ。

終わりに

SQLならこうできるのに!というのがまだあるため、もっとDataFrameに慣れないとなー。