はじめに
データサイエンス100本ノック(構造化データ加工編) - Python
P-074: レシート明細データフレーム(df_receipt)の売上日(sales_ymd)に対し、当該週の月曜日からの経過日数を計算し、売上日、当該週の月曜日付とともに表示せよ。結果は10件表示させれば良い(なお、sales_ymdは数値でデータを保持している点に注意)。
において、模範解答は
を使用している。
pandasにも時間用の関数はあるはずなのでやってみました。
コード例
A-074
df_receipt[['customer_id','sales_ymd']].assign(
sales_ymd = pd.to_datetime(df_receipt.sales_ymd.astype('str')),
sales_weekday = lambda x: x.sales_ymd.dt.day_name(),
day_ofmonday = lambda x: x.sales_ymd.dt.dayofweek.map(lambda s: pd.Timedelta(days=s)),
monday=lambda x: x.sales_ymd - x.day_ofmonday
)
customer_id | sales_ymd | sales_weekday | day_ofmonday | monday | |
---|---|---|---|---|---|
0 | CS006214000001 | 2018-11-03 | Saturday | 5 days | 2018-10-29 |
1 | CS008415000097 | 2018-11-18 | Sunday | 6 days | 2018-11-12 |
2 | CS028414000014 | 2017-07-12 | Wednesday | 2 days | 2017-07-10 |
3 | ZZ000000000000 | 2019-02-05 | Tuesday | 1 days | 2019-02-04 |
4 | CS025415000050 | 2018-08-21 | Tuesday | 1 days | 2018-08-20 |
... | ... | ... | ... | ... | ... |
104676 | ZZ000000000000 | 2018-02-21 | Wednesday | 2 days | 2018-02-19 |
104677 | ZZ000000000000 | 2019-09-11 | Wednesday | 2 days | 2019-09-09 |
104678 | CS040513000195 | 2017-03-11 | Saturday | 5 days | 2017-03-06 |
104679 | CS002513000049 | 2017-03-31 | Friday | 4 days | 2017-03-27 |
104680 | ZZ000000000000 | 2019-04-23 | Tuesday | 1 days | 2019-04-22 |
104681 rows × 5 columns
解説
を見てみると、Timedelta
が使えそう。
いろいろ試してみると、pandas.Series.mapでpandas.Timedeltaをつくってあげると、そのまま足し算引き算できそう。
引数に指定するので、関数を作ってあげて、順番に列を作成していった。
最初はDataFrame.apply
やDateOffsetでやってみたけど、遅かったり、戻り値の形が違ってしまったので、今の形に落ち着いた。
まとめ
pandas.Series.map
の使い方がまだまだですので、練習。練習。