データサイエンス100本ノックでSQLとPythonを勉強していきます。
S-020: レシート明細テーブル(receipt)に対し、1件あたりの売上金額(amount)が高い順にランクを付与し、先頭10件を抽出せよ。項目は顧客ID(customer_id)、売上金額(amount)、付与したランクを表示させること。なお、売上金額(amount)が等しい場合でも別順位を付与すること。
SQLでは以下のようになります。
select customer_id, amount, ROW_NUMBER() OVER(order by amount DESC) AS RANKING from receipt limit 10 ;
Pythonでは以下のようになります。
df_tmp = pd.concat([df_receipt[['customer_id','amount']] ,df_receipt['amount'].rank(method='first', ascending=False)],axis=1) df_tmp.columns = ['customer_id','amount','ranking'] df_tmp.sort_values('ranking',ascending=True).head(10)
pandasのconcat関数については以下に説明がありました。
pandas.pydata.org
customer_idとamountはそのままデータフレームから取得し、rankはconcatで連結させているようです。