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

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列与你的预期完全一致:

MSISDNSERVICE_FROMSERVICE_TOSERVICE_CODESERVICE_VALUETC_TIMESTC_TRIMTC_CONSECUTIVE
x122023-02-27 15:50:292023-03-07 16:00:18TC10.01NaNNo
x122023-07-19 08:33:192023-10-09 07:45:49TC35.0225.0Yes
x122023-10-09 07:45:492024-01-09 07:45:49TC35.030.0Yes
x232023-06-01 09:07:372023-08-22 15:54:25TC15.01NaNYes
x232023-08-22 15:54:252023-11-12 17:00:50TC15.020.0Yes

内容的提问来源于stack exchange,提问作者MOA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:04:55