You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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 / 2
  • 25% 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:28:27