如何用Pandas多函数计算促销前后总营收?附示例数据
Pandas计算促销前后总营收的多种实现方式
首先初始化示例DataFrame:
import pandas as pd data = { 'product_code': ['P11', 'P03', 'P07', 'P15', 'P05'], 'base_price': [190, 156, 300, 3000, 55], 'promo_type': ['50% OFF', '25% OFF', 'BOGOF', '500 Cashback', '25% OFF'], 'q_bef': [34, 393, 22, 329, 108], 'q_aft': [52, 322, 85, 1000, 93] } df = pd.DataFrame(data)
一、计算促销前总营收
需求为:sum(base_price * q_bef),以下是几种实现方式:
方法1:直接算术运算 + 求和
最简洁高效的实现,利用Pandas向量化运算特性:
total_revenue_before = (df['base_price'] * df['q_bef']).sum()
先逐行计算单个产品的促销前营收,再对结果列求和。
方法2:使用apply()逐行处理
适合需要自定义复杂逻辑的场景(此处仅作示例,实际无需额外复杂操作):
total_revenue_before = df.apply(lambda row: row['base_price'] * row['q_bef'], axis=1).sum()
通过lambda函数对每行计算单产品营收,再求和。
方法3:新增中间列后求和
如果需要保留促销前单产品营收数据,可先新增列再求和:
df = df.assign(revenue_before=df['base_price'] * df['q_bef']) total_revenue_before = df['revenue_before'].sum()
二、计算促销后总营收
规则:
50% OFF:实际单价 =base_price / 225% OFF:实际单价 =base_price / 4- 其他促销类型(如BOGOF、Cashback)默认按基准价格计算,可根据需求扩展规则。
方法1:使用numpy.select()多条件匹配
多分支条件判断的最优实现,代码可读性高:
import numpy as np # 定义条件和对应的单价计算逻辑 conditions = [ df['promo_type'] == '50% OFF', df['promo_type'] == '25% OFF' ] choices = [ df['base_price'] / 2, df['base_price'] / 4 ] # 计算实际单价,默认使用基准价格 df['actual_price'] = np.select(conditions, choices, default=df['base_price']) # 计算总营收 total_revenue_after = (df['actual_price'] * df['q_aft']).sum()
方法2:使用apply()自定义函数
灵活处理复杂逻辑,适合规则频繁变动的场景:
def get_actual_price(row): if row['promo_type'] == '50% OFF': return row['base_price'] / 2 elif row['promo_type'] == '25% OFF': return row['base_price'] / 4 else: return row['base_price'] df['actual_price'] = df.apply(get_actual_price, axis=1) total_revenue_after = (df['actual_price'] * df['q_aft']).sum()
方法3:映射折扣比例计算
通过字典映射促销类型到折扣比例,代码简洁易维护:
# 构建促销类型到折扣比例的映射(50% OFF对应0.5,25% OFF对应0.25) discount_map = { '50% OFF': 0.5, '25% OFF': 0.25 } # 获取每行的折扣比例,默认1(无折扣) discount_ratio = df['promo_type'].map(discount_map).fillna(1) # 计算实际单价 df['actual_price'] = df['base_price'] * discount_ratio # 计算总营收 total_revenue_after = (df['actual_price'] * df['q_aft']).sum()
内容的提问来源于stack exchange,提问作者Sudha Rani Devarakonda
相关产品推荐
相关产品推荐

