Python Pandas实现MSISDN的TC服务连续日期标记问题
问题解决:标记同一MSISDN下的连续TC服务
原代码问题分析
你的代码存在两个关键错误:
- 未按
MSISDN分组就使用shift(1),导致跨用户进行时间比较,逻辑完全错误; - 后续用
duplicated将所有非首行强制设为No,直接覆盖了之前的连续判断,完全不符合需求。
正确实现代码
import pandas as pd import numpy as np # 构造原始DataFrame data = { 'MSISDN': ['x12', 'x12', 'x12', 'x23', 'x23'], 'SERVICE_FROM': ['2023-02-27 15:50:29', '2023-07-19 08:33:19', '2023-10-09 07:45:49', '2023-06-01 09:07:37', '2023-08-22 15:54:25'], 'SERVICE_TO': ['2023-03-07 16:00:18', '2023-10-09 07:45:49', '2024-01-09 07:45:49', '2023-08-22 15:54:25', '2023-11-12 17:00:50'], 'SERVICE_CODE': ['TC', 'TC', 'TC', 'TC', 'TC'], 'SERVICE_VALUE': [10.0, 35.0, 35.0, 15.0, 15.0], 'TC_TIMES': [1, 2, 3, 1, 2], 'TC_TRIM': [float('nan'), 25.0, 0.0, float('nan'), 0.0] } valid_msisdns = pd.DataFrame(data) # 按用户和服务开始时间排序 valid_msisdns.sort_values(by=['MSISDN', 'SERVICE_FROM'], inplace=True) # 按MSISDN分组,判断连续条件 # 条件1:当前行的SERVICE_FROM等于上一行的SERVICE_TO(被上一行连续) prev_consecutive = valid_msisdns.groupby('MSISDN')['SERVICE_TO'].shift(1) == valid_msisdns['SERVICE_FROM'] # 条件2:当前行的SERVICE_TO等于下一行的SERVICE_FROM(连续到下一行) next_consecutive = valid_msisdns.groupby('MSISDN')['SERVICE_FROM'].shift(-1) == valid_msisdns['SERVICE_TO'] # 满足任一条件标记为Yes,否则No valid_msisdns['TC_CONSECUTIVE'] = np.where(prev_consecutive | next_consecutive, 'Yes', 'No')
输出结果
运行后得到的TC_CONSECUTIVE列与你的预期完全一致:
| MSISDN | SERVICE_FROM | SERVICE_TO | SERVICE_CODE | SERVICE_VALUE | TC_TIMES | TC_TRIM | TC_CONSECUTIVE |
|---|---|---|---|---|---|---|---|
| x12 | 2023-02-27 15:50:29 | 2023-03-07 16:00:18 | TC | 10.0 | 1 | NaN | No |
| x12 | 2023-07-19 08:33:19 | 2023-10-09 07:45:49 | TC | 35.0 | 2 | 25.0 | Yes |
| x12 | 2023-10-09 07:45:49 | 2024-01-09 07:45:49 | TC | 35.0 | 3 | 0.0 | Yes |
| x23 | 2023-06-01 09:07:37 | 2023-08-22 15:54:25 | TC | 15.0 | 1 | NaN | Yes |
| x23 | 2023-08-22 15:54:25 | 2023-11-12 17:00:50 | TC | 15.0 | 2 | 0.0 | Yes |
内容的提问来源于stack exchange,提问作者MOA
相关产品推荐
相关产品推荐

