- データサイエンス100本ノックをやりきる会を作りました🎉
- こちらのSlack招待URLからご参加ください!!
- ぜひ一緒に励まし合いながら、データサイエンス100本ノックをやり切りたいと思っています!
##Youtube
動画解説もしています。
##問題
P-026: レシート明細データフレーム(df_receipt)に対し、顧客ID(customer_id)ごとに最も新しい売上日(sales_ymd)と古い売上日を求め、両者が異なるデータを10件表示せよ。
##解答
df_sales_ymd = df_receipt.groupby('customer_id').agg({'sales_ymd':['max','min']}).reset_index()
df_sales_ymd.columns = ['customer_id','sales_ymd_max','sales_ymd_min']
df_sales_ymd.query('sales_ymd_max != sales_ymd_min').head(10)
##出力
customer_id | sales_ymd_max | sales_ymd_min | |
---|---|---|---|
1 | CS001114000005 | 20190731 | 20180503 |
2 | CS001115000010 | 20190405 | 20171228 |
3 | CS001205000004 | 20190625 | 20170914 |
4 | CS001205000006 | 20190224 | 20180207 |
13 | CS001214000009 | 20190902 | 20170306 |
14 | CS001214000017 | 20191006 | 20180828 |
16 | CS001214000048 | 20190929 | 20171109 |
17 | CS001214000052 | 20190617 | 20180208 |
20 | CS001215000005 | 20181021 | 20170206 |
21 | CS001215000040 | 20171022 | 20170214 |
##解説
・PandasのDataFrame/Seriesにて、同じ値を持つデータをまとめて処理し、同じ値を持つデータの合計や平均などを確認したい時に使用します。
・'groupby'は、同じ値や文字列を持つデータをまとめて、それぞれの同じ値や文字列に対して、共通の操作(合計や平均など)を行いたい時に使います。
・'.agg({'sales_ymd':['max','min']})'は、'.sales_ymd'の最大値(=最も新しい売上日)と最小値(=最も古い売上日)を表示させます。
・'.reset_index()'は、'groupby'によってバラバラになったインデックス番号を0始まりの連番に振り直す操作を行いたい時に使います。
・2行目、3行目は、既出のコードになりますが、'.columns'で列名を指定し、'.query'で条件を指定しています**
※2行目は、以下のコードでも、同じ結果を出力します
ただし、'customer_id'が'customer_id_'になってしまいます
df_sales_ymd.columns = ["_".join(pair) for pair in df_sales_ymd.columns]