Python【前処理】補習塾

【Excel操作のイメージでPandas前処理③】表の結合、列同士の計算、条件によって値が変わる列追加【VLOOKUPみたいな操作】

Python【前処理】補習塾
【基本データ】(基本情報・リスト)
product_list …商品名と値段の2列、メニュー表みたいなもの。
list_2021 …顧客リスト。登録順につけたIDと、企業名・所在地・電話番号・アドレス・業種を記録している。
【記録データ】
202107_list …日々の販売記録。購入日・ID・商品・合計支払金額を記録しており、毎日新しい行が下に追加される。(商品ごとに記録していたが、個数を記録していない)

今回やりたいことは、次のとおりです。
①データフレームを結合したい。
②列同士の計算をしたい。(→支払金額÷単価で個数を計算したい)
③特別な条件をつけて列同士の計算をしたい。

(準備)商品リストcsvの読み込み

# pandasを読み込む
import pandas as pd

# pathを指定しておく
path_03 = "(product_list.csvのコピーしたパス)"

# df_kokyakuにデータ(product_list.csv)を読み込む
df_syohin = pd.read_csv(path_03)

# 先頭5行を見て確認する
df_syohin.head()

データを結合する(右隣に表をくっつける) pd.merge(A, B, how=” “, on=” “)

記録データ(df_01)は各商品の合計金額しかないので、これに『個数』の列を追加したいと思います。
個数を求めるためには、商品A~Eの単価があれば、個数=合計金額÷単価で出すことができるので、まず単価情報が必要です。
df_01には商品名A~Eがあるので、これをキーにしてdf_01に単価情報を持ってきます。
Excelだと、VLOOKUP関数を使ってメニュー表(df_syohin)から商品名を検索し、単価情報を引っ張ってきますよね。
vlookup(検索値, 検索範囲, 左から何列目, 検索方法)
=VLOOKUP(A1,メニュー表$A:B,2,FALSE)
まず、この操作…df_01に『単価』列の追加をやってみます。

# df_01の右側にdf_syohinの情報をもってくる
# できたデータはdf_01_1に入れる
df_01_1 = pd.merge(df_01, df_syohin, how="left", on=("商品"))

# 確認
df_01_1.head()

表(データフレーム)の結合は「merge」を使います。

pd.merge(A, B, how=” “, on=” “)
『Aの右側にBを結合、左の表を基準にする(how=”left”)。 キーになるの列はこれ(on=”列名”)』

という意味になっており、今回の場合だと

pd.merge(df_1, df_syohin, how=”left”, on=(“商品”))
df_01の右側にdf_syohinを結合。左の表(df_01)を基準にする。キーになる列は”商品”列。

という意味になっています。

 

列同士の計算を行う(支払金額列÷単価=個数の列を作成)

新しく単価の列を入れたdf_01_1に、個数を計算した列を新しく追加します。
個数は『支払金額列÷単価』なので、『支払金額』列を『単価』列で割って、その計算結果を新しい『個数』列に入れてほしいです。

# df_01_1に『個数』列を追加
df_01_1["個数"] = df_01_1["支払金額"]/df_01_1["単価"]

# 確認
df_01_1.head()

これで、df_01_1に新しく『個数』の列が追加されました。

 

条件によって値が変わる列を追加

今回、『5,000円以上お買い上げでクーポン券プレゼント』という企画を行っていたので、クーポン券プレゼント対象の記録には「1」、それ以外は「0」の値が入った『クーポン』列を追加します。
これを実現するには、『支払金額が5,000以上』なら「1」となるようにするため、Excelなら
=IF(D1>=5000,1,0)
となるように、if文を使用しますが、これを新しく作る『クーポン』列全てに適用するため、次のように書きます。

# 関数を作る
def hantei(x):
  if x.iloc[3] >= 5000 :
    return 1
  else:
    return 0

# 新しい『クーポン』列に、関数を適用する
df_01_1["クーポン"] = df_01_1.apply(hantei, axis=1)

# 確認
df_01_1.head()

まず「hantei」という新たな関数をdefで定義します。
「.iloc[N, M]」は「N行、M列目」という意味で、今回は

「x.iloc[2]」…x(対象となる表)のiloc[2](3列目==『支払金額』)が>=5000(5000以上)ならば
return 1 =「1」を返す
else(それ以外)なら
retuen 0 =「0」を返す

という関数を作り、これをdf_01_1の[“クーポン”]列に、行方向=縦方向(axis=1)へ適用(apply)せよ

という構図になっています。

 

 

【プログラミング入門書ランキング】

 

コメント

タイトルとURLをコピーしました