Reputation: 1
I have two dataframes as shown below. I'd like to create non_promo_price
and price
columns in sales_df
. If the week
and year
values for a row in sales_df
lie between the start_week
, start_year
and end_week
, end_year
in promo_df
, the non_promo_price
and price
values in promo_df
need to mapped to sales_df
. The values need to be 0 if there is no week corresponding to it in promo_df
.
sales_df.head()
S.no | ppg | year | week | value_ty | unit_ty | price/unit |
---|---|---|---|---|---|---|
0 | Daia_Refill_1.8liter | 2018 | 1 | 8963.05 | 1631 | 5.50 |
1 | Daia_Refill_1.8liter | 2018 | 9 | 29205.14 | 4434 | 6.59 |
2 | Daia_Refill_1.8liter | 2018 | 10 | 30062.83 | 4561 | 6.59 |
3 | Daia_Refill_1.8liter | 2018 | 11 | 22691.00 | 3443 | 6.59 |
4 | Daia_Refill_1.8liter | 2018 | 12 | 29381.84 | 4463 | 6.58 |
5 | Downy Perfume_Refill_490-580ml | 2021 | 22 | 48742.50 | 9945 | 4.90 |
promo_df.head()
sno. | ppg | non_promo_price | price | start_year | start_week | end_year | end_week |
---|---|---|---|---|---|---|---|
0 | Daia_Refill_1.8liter | 6.20 | 5.28 | 2018 | 2 | 2018 | 4 |
1 | Daia_Refill_1.8liter | 6.20 | 5.29 | 2018 | 7 | 2018 | 9 |
2 | Daia_Refill_1.8liter | 5.99 | 5.49 | 2018 | 20 | 2018 | 22 |
3 | Daia_Refill_1.8liter | 5.99 | 5.09 | 2018 | 25 | 2018 | 27 |
4 | Daia_Refill_1.8liter | 6.65 | 5.48 | 2019 | 1 | 2019 | 3 |
5 | Daia_Refill_1.8liter | 6.65 | 5.29 | 2019 | 12 | 2019 | 14 |
I tried a left join on sales_df
but it was giving me null values for non_promo_price
and price
for weeks that have no data in promo_df
.
pd.merge(sales_df, promo_df, left_on=["ppg", "year", "week"], right_on=["ppg", "start_year", "start_week"], how="left",)
S no. | ppg | year | week | value_ty | unit_ty | price/unit | non_promo_price | price | start_year | start_week | end_year | end_week |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Daia_Refill_1.8liter | 2018 | 1 | 8963.05 | 1631 | 5.50 | NaN | NaN | NaN | NaN | NaN | NaN |
1 | Daia_Refill_1.8liter | 2018 | 9 | 29205.14 | 4434 | 6.59 | NaN | NaN | NaN | NaN | NaN | NaN |
2 | Daia_Refill_1.8liter | 2018 | 10 | 30062.83 | 4561 | 6.59 | NaN | NaN | NaN | NaN | NaN | NaN |
Upvotes: 0
Views: 38
Reputation: 13242
temp_df = sales_df.merge(promo_df, how='left')
temp_df = temp_df[(temp_df.week.between(temp_df.start_week, temp_df.end_week)) & (temp_df.year.between(temp_df.start_year, temp_df.end_year))]
print(temp_df)
Output:
ppg year week value_ty unit_ty price/unit non_promo_price price start_year start_week end_year end_week
7 Daia_Refill_1.8liter 2018 9 29205.14 4434 6.59 6.20 5.29 2018.0 7.0 2018.0 9.0
Upvotes: 1