我有一张桌子,上面有订单,如下所示:
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)
为了更好地理解 - 视觉上:
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