
- はじめに
- 問18 顧客データフレーム(df_customer)を生年月日(birth_day)で若い順にソートし、先頭10件を全項目表示せよ。
- 問19 レシート明細データフレーム(df_receipt)に対し、1件あたりの売上金額(amount)が高い順にランクを付与し、先頭10件を抽出せよ。項目は顧客ID(customer_id)、売上金額(amount)、付与したランクを表示させること。なお、売上金額(amount)が等しい場合は同一順位を付与するものとする。
- 問20 レシート明細データフレーム(df_receipt)に対し、1件あたりの売上金額(amount)が高い順にランクを付与し、先頭10件を抽出せよ。項目は顧客ID(customer_id)、売上金額(amount)、付与したランクを表示させること。なお、売上金額(amount)が等しい場合でも別順位を付与すること。
- もっと詳しく知りたい方へ
はじめに
問18~問20のコードの説明を初心者や初学者でもわかるような方法でまとめました。
データサイエンス100本ノックのはじめ方は、以下のブログ記事を参考にしてください。
>>【Google Colabはじめ方】データサイエンス100本ノックーデータサイエンティスト協会
問18 顧客データフレーム(df_customer)を生年月日(birth_day)で若い順にソートし、先頭10件を全項目表示せよ。
(df_customer)を生年月日(birth_day)をソートするには、sort_values()を使用します。また、若い順(年月日が新しいのが一番上順)なので、df_customer.sort_values(‘カラム名’, ascending=False)となります。
なお、ascending=Trueは昇順、ascending=Falseは降順に並び替えられ、ascending=Trueは省略することもできます。
また、先頭10件を表示は.head(10)です。
df_customer.sort_values('birth_day',ascending=False).head(10)
問19 レシート明細データフレーム(df_receipt)に対し、1件あたりの売上金額(amount)が高い順にランクを付与し、先頭10件を抽出せよ。項目は顧客ID(customer_id)、売上金額(amount)、付与したランクを表示させること。なお、売上金額(amount)が等しい場合は同一順位を付与するものとする。
まず、「(df_receipt)に対し、1件あたりの売上金額(amount)が高い順にランクを付与し」てみます。ランク付けには、.rank()を使用します。( )内には、同じ値を持つレコードのグループのランク付けとして、最小の順位を付けるmethod=’min’を使用し、降順の ascending=Falseを使用します。
df_tmp = df_receipt['amount'].rank(method='min',ascending=False)
df_tmp
その結果が以下になります。
次に、「項目は顧客ID(customer_id)、売上金額(amount)、付与したランクを表示」しないといけないので、df_tmpに対して、(df_receipt)の顧客ID(customer_id)、売上金額(amount)を、横方向に連結させます。
横方向に連結させるためにはpd.concat([データフレーム1,データフレーム2], axis=1)を使用します。
なお、縦方向に連結させる場合は、axis=0です。
df_tmp2 = pd.concat([df_receipt[['customer_id','amount']],df_tmp],axis=1)
df_tmp2
その結果が以下です。
連結できましたが、最後をカラムはランク付けしたものなので、カラム名を’ranking’に変えます。
df_tmp2.columns = ['customer_id','amount','ranking']
最後に、問17、問18で学んだように、高い順に並び替えを行い、先頭10件を表示します。
df_tmp2.sort_values('ranking').head(10)
なお、別回答として、df_tmpをデータフレームで作成して、そこですでにカラム名を変えてしまうという方法もあります。
df_tmp_0 = pd.DataFrame(df_receipt['amount'].rank(method='min',ascending=False)).rename(columns={'amount':'ranking'})
df_tmp_0 = pd.concat([df_receipt[['customer_id','amount']],df_tmp_0],axis=1)
df_tmp_0.sort_values('ranking').head(10)
問20 レシート明細データフレーム(df_receipt)に対し、1件あたりの売上金額(amount)が高い順にランクを付与し、先頭10件を抽出せよ。項目は顧客ID(customer_id)、売上金額(amount)、付与したランクを表示させること。なお、売上金額(amount)が等しい場合でも別順位を付与すること。
こちらの処理は問19とほとんど同じです。ですので、詳細は上記問19をご覧ください。
違う点は、「売上金額(amount)が等しい場合でも別順位を付与する」というところです。
これは、ランクが等しい場合でも別順位を付与する.rank(method=’first’)を使用します。
df_tmp = df_receipt['amount'].rank(method='first',ascending=False)
df_tmp2 = pd.concat([df_receipt[['customer_id','amount']],df_tmp],axis=1)
df_tmp2.columns = ['customer_id','amount','ranking']
df_tmp2.sort_values('ranking').head(10)
もっと詳しく知りたい方へ
機械学習やデータサイエンスを独学で学ぶには、どうしたらよいかをまとめてみましたので、興味がある方はこちらのブログ記事をご覧ください。
