データサイエンス100本ノック(構造化データ加工編)
GitHubにColaboratoryが用意されているので、自分のドライブにコピーするだけで簡単に始められます。
※協会が出している解答の書き方と異なる箇所もありますが、出力としては同じになっています。協会の解答はGitHubから確認してください。解説本も販売されています。
解答
P021
レシート明細データ(df_receipt)に対し、件数をカウントせよ。
len(df_receipt)
P022
レシート明細データ(df_receipt)の顧客ID(customer_id)に対し、ユニーク件数をカウントせよ。
len(df_receipt['customer_id'].unique())
P023
レシート明細データ(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)と売上数量(quantity)を合計せよ。
df_receipt.groupby('store_cd').agg({'amount':'sum','quantity':'sum'})
P024
レシート明細データ(df_receipt)に対し、顧客ID(customer_id)ごとに最も新しい売上年月日(sales_ymd)を求め、10件表示せよ。
df_receipt.groupby('customer_id').agg({'sales_ymd':'max'}).head(10)
P025
レシート明細データ(df_receipt)に対し、顧客ID(customer_id)ごとに最も古い売上年月日(sales_ymd)を求め、10件表示せよ。
df_receipt.groupby('customer_id').agg({'sales_ymd':'min'}).head(10)
P026
レシート明細データ(df_receipt)に対し、顧客ID(customer_id)ごとに最も新しい売上年月日(sales_ymd)と古い売上年月日を求め、両者が異なるデータを10件表示せよ。
tmp = df_receipt.groupby('customer_id').agg({'sales_ymd':['max','min']}).reset_index()
tmp.columns.droplevel(1)
tmp.columns = ['customer_id', 'sales_ymd_max', 'sales_ymd_min']
tmp.query('sales_ymd_max != sales_ymd_min').head(10)
マルチインデックスのDataFrameで考えます。
DataFrame.droplevel(level, axis=0)で列名をいじれます。
P027
レシート明細データ(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)の平均を計算し、降順でTOP5を表示せよ。
df_receipt.groupby('store_cd').agg({'amount':'mean'}).reset_index().sort_values('amount',ascending = False).rename(columns ={'amount':'amount_mean'}).head()
P028
レシート明細データ(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)の中央値を計算し、降順でTOP5を表示せよ。
df_receipt.groupby('store_cd').agg({'amount':'median'}).reset_index().sort_values('amount',ascending = False).rename(columns ={'amount':'amount_median'}).head()
P029
レシート明細データ(df_receipt)に対し、店舗コード(store_cd)ごとに商品コード(product_cd)の最頻値を求め、10件表示させよ。
df_receipt.groupby('store_cd')['product_cd'].apply(lambda x:x.mode()).reset_index().head(10)
DataFrame.mode()を使おうとしたのですが、groupbyを使ってるとエラーになります。残念ながらmode()は使える組み込み関数一覧にありませんでしたが、mean()、count()あたりは使えます。
P030
レシート明細データ(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)の分散を計算し、降順で5件表示せよ。
df_receipt.groupby('store_cd').agg({'amount':'var'}).reset_index().sort_values('amount',ascending = False).rename(columns ={'amount':'amount_var'}).head()