LoginSignup
5
4

More than 1 year has passed since last update.

pandasで列同士の値を比較して新たなフラグ列を作る

Last updated at Posted at 2021-07-05

A列の値とB列の値を比較し、その大小関係を0/1で表す

import pandas as pd

df_t = pd.DataFrame({'登録日': ['2021-04-11','2021-06-09','2021-08-15','2021-08-18','2021-09-02','2021-09-10']
                    ,'商品名': ['A', 'B', 'B','C', 'C', 'A'] 
                    ,'配送先': ['東京', '愛知', '兵庫','宮城', '大阪', '静岡']
                    ,'基準日': ['2021-05-11','2021-08-11','2021-08-11','2021-09-02','2021-09-02','2021-05-11']
                    })

print(df_t)
#      登録日    商品名 配送先  基準日
# 0  2021-04-11   A   東京  2021-05-11
# 1  2021-06-09   B   愛知  2021-08-11
# 2  2021-08-15   B   兵庫  2021-08-11
# 3  2021-08-18   C   宮城  2021-09-02
# 4  2021-09-02   C   大阪  2021-09-02
# 5  2021-09-10   A   静岡  2021-05-11

例えば上のように、商品ごとの売上記録があるとします。
そして、データの「登録日」が「基準日」より前の記録は何件あるか?ということが知りたいとします。
そんな時は、両方の列を比較し、

・ 登録日が基準日よりも前なら1
・ 後なら0

を格納する列(例:'flg')を新たに作り、その列の合計を取得すればいいです。(もっとスマートなやり方があるかもですが)
このflg列を作るコードは以下。

df_t.loc[df_t['登録日'] < df_t['基準日'], 'flg'] = 1
df_t.loc[df_t['登録日'] >= df_t['基準日'], 'flg'] = 0
df_t

結果:

登録日 商品名 配送先 基準日 flg
0 2021-04-11 A 東京 2021-05-11 1.0
1 2021-06-09 B 愛知 2021-08-11 1.0
2 2021-08-15 B 兵庫 2021-08-11 0.0
3 2021-08-18 C 宮城 2021-09-02 1.0
4 2021-09-02 C 大阪 2021-09-02 0.0
5 2021-09-10 A 静岡 2021-05-11 0.0

「登録日」が「基準日」より前の記録件数は

df_t['flg'].sum()
# 3.0

追記:

ありがたいことにコメントをいただいたのですが、

df_t.assign(flg=df_t['登録日'] < df_t['基準日'])

df_t.eval('flg = 登録日 < 基準日')

といったコードでもflg列は作れます。この場合、

登録日 商品名 配送先 基準日 flg
0 2021-04-11 A 東京 2021-05-11 True
1 2021-06-09 B 愛知 2021-08-11 True
2 2021-08-15 B 兵庫 2021-08-11 False
3 2021-08-18 C 宮城 2021-09-02 True
4 2021-09-02 C 大阪 2021-09-02 False
5 2021-09-10 A 静岡 2021-05-11 False

というように、flg列は1/0ではなく True/Falseになりますが、この場合でも

df_t['flg'].sum()
# 3.0

を実行してもきちんと和がでます。"1/0 と True/Falseは等価"ということは知りませんでした。
お恥ずかしい..

5
4
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4