Contents
groupby
new_df = df[['顧客番号','金額']].groupby('顧客番号').sum().reset_index().sort_values('金額', ascending=False)
new_df['累積金額'] = new_df['金額'].cumsum()
GroupByの処理
groupbyをすると、
上記は最初のdf[[]]で指定したものがgroupbyの対象になる。
そして次のgroupbyで指定したものでグルーピングされる。上記だと顧客番号。
よって顧客番号でグルーピングを行い、ではどの値に対してsum()をするのか?それは最初に指定したものが、
今回は顧客番号と金額になるので、グルーピングする顧客番号以外の項目、つまり金額が今回はsumの対象になる。
GroupByを実行するとindex
df[['顧客番号','金額']].groupby('顧客番号')、
groupbyをすると、顧客番号はindexに貼られてしまう。
なので、その後にreset_index()をしてindexを解除し顧客番号も普通に列に戻すようにしている。
tailやheadとの組み合わせ
よくサンプルコードなどでも、
df.head()など
データフレームdfの上位5件のみ表示/抜き取りするようなことができます。
なので、これを利用して、tail()やhead()を使って上位1件を取得するようなこともできます。
user_maxdate_df = df[['顧客番号','受注日']].sort_values('受注日', ascending=True).groupby('顧客番号').tail(1).rename(columns={'受注日':'最新購入日(受注日)'})
SQLなどを使用していると、partition byなどで順番処理をしてその1行目のレコードのみ取得みたいなことをしたりする。
dataframdeでも同じようにGroupbyして、その一番上のレコードのみを取得するようなことができます。
上の例でいうと、
顧客番号でグルーピングをすると、その顧客番号でdataframeが生成される。この原理を用いて、
まずsort_valuesで受注日を降順に並び替え、そして顧客番号でグルーピングすると、顧客番号ごとのdataframeには受注日の降順で生成される。
なので、tail()でその最初のレコード、つまり最新受注日(購入日)を取得する
列ごとに行に対して処理を行う
通常
df["割合(%)"]*100
とすると、全ての割合に対して100をかける。
df["金額"] + df["金額2"]
とすると、全ての行に対して横計算をする。
merge
mergeを使うことで、SQLのようなjoinによるデータフレーム結合が可能
# 顧客ごとのデータを取得する(join)
c = pd.merge(new_df, user_maxdate_df, on='顧客番号')
display(pd.merge(c, user_purchasecount_df, on='顧客番号').head())
applyとtransform
独自関数で処理をすることが可能