我如何计算每个订单的价值

问题描述 投票:0回答:1

我有一张桌子,上面有订单,如下所示:

orders_data = {
    'date_order': ['2024-04-01', '2024-04-01', '2024-04-01', '2024-04-02'],
    'order_id': [1, 2, 3, 4],
    'article_id': ['A', 'A', 'B', 'A'],
    'quantity': [5, 1, 3, 2],
    'final_price': [50, 50, 30, 20],
    'logistics_costs': [10, 10, 5, 4],
    'revenue': [200, 100, 80, 40],
    'cost_price': [30, 30, 20, 15],
    'profit': [160, 70, 60, 25]
}

orders = pd.DataFrame(orders_data)

还有一张广告费用表:

adv_data = {
    'adv_date': ['2024-04-01', '2024-04-02', '2024-04-03'],
    'article_id': ['A', 'B', 'C'],
    'costs': [24, 10, 15]
}

adv = pd.DataFrame(adv_data)

我需要计算每笔订单的广告费用(如果有的话)。

例如:如果我在 2024 年 4 月 1 日有订单,article_id A,并且在 2024 年 4 月 1 日有article_id A 的广告费用,我将添加一列 (adv_cost),其值如下:广告费用 / 数量每篇文章(数量)的日期为 2024-04-01。

但是,如果我在 2024 年 4 月 1 日没有订单并且有广告费用,我将在除 adv_cost 之外的所有列中添加一行空值。

想要的结果如下:

result_data = {
    'date_order': ['2024-04-01', '2024-04-01', '2024-04-01', '2024-04-02', '2024-04-02','2024-04-01'],
    'order_id': [1, 2, 3, 4, 'adv_cost', 'adv_cost'],
    'article_id': ['A', 'A', 'B', 'A', 'B', 'C'],
    'quantity': [5, 1, 3, 2, 0, 0],
    'final_price': [50, 50, 30, 20, 0, 0],
    'logistics_costs': [10, 10, 5, 4, 0, 0],
    'revenue': [200, 100, 80, 40, 0, 0],
    'cost_price': [30, 30, 20, 15, 0, 0],
    'profit': [160, 70, 60, 25, 0, 0],
    'adv_cost': [20, 4, 0.0, 0.0, 10.0, 15.0]
}

result_data = pd.DataFrame(result_data)

为了更好地理解 - 视觉上:

python pandas analytics
1个回答
0
投票

IIUC,您可以结合使用

groupby.transform
merge
并进行一些后期处理:

out = (orders
  .assign(total=orders.groupby(['date_order', 'article_id'])['quantity'].transform('sum'))
  .merge(adv.rename(columns={'adv_date': 'date_order'}), how='outer', on=['date_order', 'article_id'])
  .assign(adv_cost=lambda d: d['costs'].div(d['total']).mul(d['quantity'])
                                       .fillna(d['costs']),
          order_id=lambda d: d['order_id'].fillna('adv_cost')
         )
  .drop(columns=['total', 'costs'])
  .fillna(0)
)

输出:

   date_order  order_id article_id  quantity  final_price  logistics_costs  revenue  cost_price  profit  adv_cost
0  2024-04-01       1.0          A       5.0         50.0             10.0    200.0        30.0   160.0      20.0
1  2024-04-01       2.0          A       1.0         50.0             10.0    100.0        30.0    70.0       4.0
2  2024-04-01       3.0          B       3.0         30.0              5.0     80.0        20.0    60.0       0.0
3  2024-04-02       4.0          A       2.0         20.0              4.0     40.0        15.0    25.0       0.0
4  2024-04-02  adv_cost          B       0.0          0.0              0.0      0.0         0.0     0.0      10.0
5  2024-04-03  adv_cost          C       0.0          0.0              0.0      0.0         0.0     0.0      15.0
© www.soinside.com 2019 - 2024. All rights reserved.