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は等価"ということは知りませんでした。
お恥ずかしい..