今回やりたいことは、次のとおりです。
①データフレームを結合したい。
②列同士の計算をしたい。(→支払金額÷単価で個数を計算したい)
③特別な条件をつけて列同士の計算をしたい。
(準備)商品リスト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)せよ
という構図になっています。
【プログラミング入門書ランキング】
コメント