【問18~問20】データサイエンス100本ノック 解説

※アフィリエイト広告を利用しています。

ファイル

はじめに

問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)

もっと詳しく知りたい方へ

機械学習データサイエンス独学で学ぶには、どうしたらよいかをまとめてみましたので、興味がある方はこちらのブログ記事をご覧ください。