##Youtube
動画解説もしています。
##問題
P-020: レシート明細データフレーム(df_receipt)に対し、1件あたりの売上金額(amount)が高い順にランクを付与し、先頭10件を抽出せよ。項目は顧客ID(customer_id)、売上金額(amount)、付与したランクを表示させること。なお、売上金額(amount)が等しい場合でも別順位を付与すること。
##解答
df_amount_rank = pd.concat([df_receipt[['customer_id', 'amount']] \
,df_receipt['amount'].rank(method='first', ascending=False)], axis=1)
df_amount_rank.columns = ['customer_id', 'amount', 'amount_ranking']
df_amount_rank.sort_values('amount_ranking', ascending=True).head(10)
##出力
customer_id | amount | amount_ranking | |
---|---|---|---|
1202 | CS011415000006 | 10925 | 1 |
62317 | ZZ000000000000 | 6800 | 2 |
54095 | CS028605000002 | 5780 | 3 |
4632 | CS015515000034 | 5480 | 4 |
10320 | ZZ000000000000 | 5480 | 5 |
72747 | ZZ000000000000 | 5480 | 6 |
28304 | ZZ000000000000 | 5440 | 7 |
97294 | CS021515000089 | 5440 | 8 |
596 | CS015515000083 | 5280 | 9 |
11275 | CS017414000114 | 5280 | 10 |
##解説
・PandasのDataFrame/Seriesにて、ランク列を新たに作成し、列を連結して、データを順位付けする方法です。
・数字情報をランキング形式で見たい時に使用します。
・'concat('<列名A>','<列名B>','<列名C>')'は、指定した列を連結する関数です。'axis=1'は、列を連結することを指します。(※'axis=0'は行方向、'axis=1'は列方向を指します)
・'rank(method(average/min/max/first),'ascending=True/False')'は、指定した列のランキングを表示する関数です。
・averageは平均値、minは低い方に揃える、maxは高い方に揃える、firstは出てきた順にランクを付与します。
・今回の場合、amount のランキングを rank で表示し、指定された列と連結するために concat を使用しています。
・'columns('<列名A>','<列名B>','<列名C>')'は、列名を再指定する関数です。
・P-017,018で使用した sort_values を用いて、ランキング順に並び直して表示しています。
※rankの参考記事はこちらです