Python Pandas实现ABC_manage_channel逻辑
问题描述
我们需要确定"ABC_manage_channel"列的逻辑,该列的值在客户连续在同一渠道下单时更新为当前渠道,否则保留之前的值。具体规则如下:
- 初始值为第一个订单的渠道
- 如果客户连续两次在同一渠道下单,则更新为当前渠道
- 否则保持前一个值不变
数据准备
首先创建orders表并插入测试数据:
CREATE OR REPLACE TABLE orders (customerid INTEGER,channel VARCHAR(20),order_date DATE
);INSERT INTO orders (customerid, channel, order_date) VALUES
(1, 'TMALL', '2024-11-01'),
(1, 'TMALL', '2024-11-02'),
(1, 'TMALL', '2024-11-03'),
(1, 'douyin', '2024-11-25'),
(1, 'JD', '2025-01-13'),
(1, 'JD', '2025-01-14'),
(1, 'douyin', '2025-03-02'),
(1, 'douyin', '2025-03-27'),
(3, 'JD', '2024-04-23'),
(4, 'JD', '2025-02-15'),
(5, 'JD', '2024-08-30'),
(6, 'douyin', '2024-10-05'),
(7, 'JD', '2024-05-29'),
(7, 'douyin', '2024-09-15'),
(7, 'Wholesale', '2024-12-22'),
(7, 'JD', '2025-03-19'),
(8, 'douyin', '2024-08-01'),
(8, 'douyin', '2024-08-07'),
(8, 'douyin', '2024-11-15'),
(9, 'JD', '2025-03-19'),
(10, 'douyin', '2024-07-30'),
(10, 'douyin', '2024-12-27'),
(10, 'douyin', '2025-03-21'),
(10, 'douyin', '2025-03-23');
解决方案
要解决这个问题,我们需要为每个客户的订单生成一个名为“ABC_manage_channel”的列,其值根据客户是否连续在同一渠道下单来更新。具体规则如下:
- 初始值为第一个订单的渠道。
- 如果客户连续两次在同一渠道下单,则更新为当前渠道。
- 否则保持前一个值不变。
方法思路
- 数据准备:读取并预处理数据,确保订单按日期排序。
- 分组处理:按客户分组,对每个客户的订单进行处理。
- 逻辑实现:遍历每个客户的订单,初始化第一个订单的值为其渠道。对于后续订单,如果当前渠道与前一个订单相同,则更新为当前渠道,否则保持前一个值。
解决代码
import pandas as pd# 创建DataFrame
orders = pd.DataFrame({'customerid': [1, 1, 1, 1, 1, 1, 1, 1, 3, 4, 5, 6, 7, 7, 7, 7, 8, 8, 8, 9, 10, 10, 10, 10],'channel': ['TMALL', 'TMALL', 'TMALL', 'douyin', 'JD', 'JD', 'douyin', 'douyin', 'JD', 'JD', 'JD', 'douyin', 'JD', 'douyin', 'Wholesale', 'JD', 'douyin', 'douyin', 'douyin', 'JD', 'douyin', 'douyin', 'douyin', 'douyin'],'order_date': ['2024-11-01', '2024-11-02', '2024-11-03', '2024-11-25', '2025-01-13', '2025-01-14', '2025-03-02', '2025-03-27', '2024-04-23', '2025-02-15', '2024-08-30', '2024-10-05', '2024-05-29', '2024-09-15', '2024-12-22', '2025-03-19', '2024-08-01', '2024-08-07', '2024-11-15', '2025-03-19', '2024-07-30', '2024-12-27', '2025-03-21', '2025-03-23']
})# 转换日期格式
orders['order_date'] = pd.to_datetime(orders['order_date'])def compute_abc(group):# 按日期排序group = group.sort_values('order_date')abc = []prev_channel = Noneprev_abc = Nonefor idx, row in group.iterrows():if len(abc) == 0:# 第一个订单current_abc = row['channel']prev_channel = row['channel']prev_abc = current_abcabc.append(current_abc)else:current_channel = row['channel']if current_channel == prev_channel:current_abc = current_channelelse:current_abc = prev_abcabc.append(current_abc)prev_channel = current_channelprev_abc = current_abcgroup['ABC_manage_channel'] = abcreturn group# 应用处理函数
result = orders.groupby('customerid', group_keys=False).apply(compute_abc)print(result)
代码解释
- 数据准备:使用Pandas创建DataFrame,并将订单日期转换为日期类型。
- 处理函数
compute_abc
:- 对每个客户的订单按日期排序。
- 遍历每个订单,第一个订单的初始值为其渠道。
- 后续订单判断当前渠道是否与前一个相同,相同则更新,否则保持前一个值。
- 分组应用:按客户分组应用处理函数,生成最终结果。