『Python実践データ分析100本ノック』ノック26〜30
今回は、『Python実践データ分析100本ノック』で学んだことをアウトプットします。
利用履歴データから定期利用フラグを作成する
顧客ごとに月/曜日別に集計を行い、最大値が4以上の曜日が1ヶ月でもあったユーザーはフラグ1とします。
つまり、顧客ごとの各月の最大値を取得し、その最大値が4以上の場合、フラグを立ててみることになります。
uselog_weekday = uselog_weekday.groupby('customer_id', as_index=False)
.max()[['customer_id', 'count']]
uselog_weekday['routine_flg'] = 0
uselog_weekday['routine_flg'] = uselog_weekday['routine_flg']
.where(uselog_weekday['count']<4, 1)
uselog_weekday.head()
pandasのwhere関数
参考にしたのは、こちらのサイト
where関数の第一引数には条件を指定、条件がTrueの場合は元の値のまま、Falseの場合は第二引数に指定した値により更新が行われる。
まず、コードの2行目で、すべてのフラグを0に設定しています。
続いて、3行目のwhere関数の第一引数に条件(uselog_weekday['count']<4)を指定、条件がTrueの場合は元の値(フラグが0)のまま、Falseの場合は第二引数に指定した値(フラグが1)により更新が行われるのです。
iloc演算子による整数でのインデックス位置の参照
整数のインデックス位置による参照を使うときにはilocでデータを参照していきます。
本書のノック28(会員期間を計算しよう)において、ilocとfor文を用いて、データフレームを上から順番に計算し、会員期間を月単位で算出しています。
from dateutil.relativedelta import relativedelta
customer_join['calc_date'] = customer_join['end_date']
customer_join['calc_date'] = customer_join['calc_date']
.fillna(pd.to_datetime('20190430'))
customer_join['membership_period'] = 0
for i in range(len(customer_join)):
delta = relativedelta(customer_join['calc_date'].iloc[i],
customer_join['start_date'].iloc[i])
customer_join['membership_period'].iloc[i] = delta.years*12 +
delta.months
customer_join.head()
コードの1行目でrelativedeltaを使用するためにライブラリのインポートをしています。これは日付の比較に使用します。
2行目で、日付計算用の列をend_dateベースに作成し、3行目で、欠損値に2019年4月30日を代入しています。
その後のfor文で、データフレームを上から順番に計算し、会員期間を月単位で算出しています。
loc演算子による軸のラベルでの参照
loc演算子で、軸のラベルを使ったデータの参照を行うことができます。
本書のノック30(退会ユーザーと継続ユーザーの違いを把握しよう)において、loc演算子を用いて、退会ユーザーと継続ユーザーを分けて、describeで比較しています。
customer_end = customer_join.loc[customer_join['is_deleted'] == 1]
customer_end.describe()
customer_stay = customer_join.loc[customer_join['is_deleted'] == 0]
customer_stay.describe()
今回の学びのまとめ
○pandasのwhere関数の第一引数には条件を指定、条件がTrueの場合は元の値のまま、Falseの場合は第二引数に指定した値により更新が行われる。
○pandasのlocとiloc演算子は、それぞれラベルベースと整数ベースでインデックス参照を行う