当ページのリンクには広告が含まれています。
目次
この記事の対象者
・ データサイエンティストを目指している人
・ Pythonのgroupby, agg, reset_index, sort_valuesメソッドの使い方を知りたい人
・ aggメソッドを使って平均値、中央値を出力する方法を知りたい人
本記事で学ぶpythonのメソッドと関数
本記事では以下のメソッドを学びます。前回の記事で学んだメソッドの復習も兼ねて学びましょう。
- groupbyメソッド: データフレームの特定の列のユニークな値でグルーピングするメソッド。
- aggメソッド: aggはgroupbyでグルーピングされた列に対して統計量を取るためのメソッドです。
- reset_indexメソッド: reset_indexメソッドは、インデックスが存在しないデータフレームにインデックスを付与するメソッドです。
早速データサイエンス100本ノックの問題を題材に、これらの使い方を学んでいきたいと思います。
データサイエンス100本ノックの始め方は、以下の記事を参考にしていただければと思います。
>>データサイエンス100本ノックの始め方
第27問目: 平均値の出力方法
P-027: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)の平均を計算し、降順でTOP5を表示せよ。
これまでの問題を取り組んできた方であれば、問題文を読んだ段階で、groupby()
メソッドとagg()
メソッド、そして、sort_values()
, head()
を用いることが思いつくと思います。
問題文を読んだ段階でこの発想が出てこなかった方は、以下の記事で紹介している23問目〜26問目の問題を復習しましょう。
>>100本ノックの23問目〜26問目を復習する
まずは、df_receipt
を確認します。
出力1 2 3 4 5 6 7 8 9 10 11 12 13
| sales_ymd sales_epoch store_cd receipt_no receipt_sub_no customer_id product_cd quantity amount 0 20181103 1541203200 S14006 112 1 CS006214000001 P070305012 1 158 1 20181118 1542499200 S13008 1132 2 CS008415000097 P070701017 1 81 2 20170712 1499817600 S14028 1102 1 CS028414000014 P060101005 1 170 3 20190205 1549324800 S14042 1132 1 ZZ000000000000 P050301001 1 25 4 20180821 1534809600 S14025 1102 2 CS025415000050 P060102007 1 90 ... ... ... ... ... ... ... ... ... ... 104676 20180221 1519171200 S13043 1132 2 ZZ000000000000 P050101001 1 40 104677 20190911 1568160000 S14047 1132 2 ZZ000000000000 P071006005 1 218 104678 20170311 1489190400 S14040 1122 1 CS040513000195 P050405003 1 168 104679 20170331 1490918400 S13002 1142 1 CS002513000049 P060303001 1 148 104680 20190423 1555977600 S13016 1102 2 ZZ000000000000 P050601001 1 138 104681 rows × 9 columns
|
これまで学んだ通り、groupby()
メソッドとagg()
メソッドを使ってデータを表示させていきます。
平均を求めるにはagg({'カラム名': 'mean'})
のように指定します。
1
| df_receipt.groupby('store_cd').agg({'amount': 'mean'})
|
出力1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| amount store_cd S12007 307.688343 S12013 330.194130 S12014 310.830261 S12029 315.623908 S12030 288.533727 S13001 348.470386 S13002 313.445736 S13003 350.915519 S13004 330.943949 S13005 316.202811 S13008 327.912480 S13009 328.141988 S13015 351.111960 S13016 329.639950 S13017 317.581070 S13018 312.464427 S13019 330.208616 S13020 337.879932 S13031 307.879634 S13032 321.472550 S13035 324.804446 S13037 299.907832 S13038 306.478167 S13039 310.918699 S13041 329.234177 S13043 318.125000 S13044 304.718549 S13051 309.659942 S13052 402.867470 S14006 315.136605 S14010 348.791262 S14011 335.718333 S14012 303.027754 S14021 314.953174 S14022 321.643457 S14023 325.561521 S14024 308.213897 S14025 319.079814 S14026 332.340588 S14027 314.918466 S14028 324.317244 S14033 321.506206 S14034 326.350974 S14036 322.811410 S14040 318.447368 S14042 278.338886 S14045 330.082073 S14046 309.098127 S14047 330.077073 S14048 308.257895 S14049 297.816774 S14050 290.591304
|
store_id毎にamountの平均を表示することが出来ました。
indexを設けるために、reset_index()
を活用します。
1
| df_receipt.groupby('store_cd').agg({'amount': 'mean'}).reset_index()
|
出力1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| store_cd amount 0 S12007 307.688343 1 S12013 330.194130 2 S12014 310.830261 3 S12029 315.623908 4 S12030 288.533727 5 S13001 348.470386 6 S13002 313.445736 7 S13003 350.915519 8 S13004 330.943949 9 S13005 316.202811 10 S13008 327.912480 11 S13009 328.141988 12 S13015 351.111960 13 S13016 329.639950 14 S13017 317.581070 15 S13018 312.464427 16 S13019 330.208616 17 S13020 337.879932 18 S13031 307.879634 19 S13032 321.472550 20 S13035 324.804446 21 S13037 299.907832 22 S13038 306.478167 23 S13039 310.918699 24 S13041 329.234177 25 S13043 318.125000 26 S13044 304.718549 27 S13051 309.659942 28 S13052 402.867470 29 S14006 315.136605 30 S14010 348.791262 31 S14011 335.718333 32 S14012 303.027754 33 S14021 314.953174 34 S14022 321.643457 35 S14023 325.561521 36 S14024 308.213897 37 S14025 319.079814 38 S14026 332.340588 39 S14027 314.918466 40 S14028 324.317244 41 S14033 321.506206 42 S14034 326.350974 43 S14036 322.811410 44 S14040 318.447368 45 S14042 278.338886 46 S14045 330.082073 47 S14046 309.098127 48 S14047 330.077073 49 S14048 308.257895 50 S14049 297.816774 51 S14050 290.591304
|
最後に、上位5位を出力するためにソートを行います。
ソートは、sort_values('amount', ascending=False)
でしたね。
>>ソートを復習する
1
| df_receipt.groupby('store_cd').agg({'amount': 'mean'}).reset_index().sort_values('amount', ascending=False).head(5)
|
出力1 2 3 4 5 6 7
| store_cd amount 28 S13052 402.867470 12 S13015 351.111960 7 S13003 350.915519 30 S14010 348.791262 5 S13001 348.470386
|
上記のコードで、head(5)
というふうに明示的に5
という数字を入れていますが、head()
というふうにしても同じ出力が得られます。headメソッドは、引数を含めない場合、デフォルトで5つを表示する仕様になっているためです。
第28問目: 中央値の表示方法
P-028: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに売上金額(amount)の中央値を計算し、降順でTOP5を表示せよ。
処理としては、第27問目とほぼ同じになります。
中央値を求めるにはagg({'カラム名': 'medium'})
のように指定します。
今回は一気に全てのメソッドを使って表示します。
1
| df_receipt.groupby('store_cd').agg({'amount': 'median'}).reset_index().sort_values('amount', ascending=False).head(5)
|
出力1 2 3 4 5 6
| store_cd amount 28 S13052 190 30 S14010 188 51 S14050 185 44 S14040 180 7 S13003 180
|
これでOKです。
リンク
まとめ: 平均値と中央値の表示方法を学びました。
本記事は、「【Python】手を動かしながら平均値と中央値の抽出方法を学ぶ | データサイエンス100本ノック【問27〜問28 回答】」というテーマでまとめました。
- 平均を求めるには
agg({'カラム名': 'mean'})
のように指定
- 中央値を求めるには
agg({'カラム名': 'medium'})
のように指定
>> 続きはこちら