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

基于Python Pandas高效生成Issue变更快照(替代逐行迭代)

高效生成Issue状态快照的Pandas实现方案

要解决逐行迭代生成Issue状态快照效率低下的问题,核心是用Pandas的向量化操作替代Python循环,以下是具体实现步骤:

1. 数据预处理

首先确保数据按Issue_Id和变更日期排序,保证时间顺序正确:

df = df.sort_values(by=['Issue_Id', '变更日期'])

如果存在同一日期同一Issue的多条变更记录,需保留当日最后一次变更的状态(若有更精细的时间字段,可按时间戳排序后去重):

df = df.drop_duplicates(subset=['Issue_Id', '变更日期'], keep='last')

2. 分组填充生成快照(高效基础版)

通过分组+向前填充(ffill()),为每个Issue生成所有变更日期的状态快照:

# 获取所有唯一的变更日期并排序
all_dates = df['变更日期'].unique().sort()

# 生成每个Issue的全日期快照
snapshot_list = []
for issue_id, group in df.groupby('Issue_Id'):
    # 创建当前Issue的全日期DataFrame
    issue_date_df = pd.DataFrame({'变更日期': all_dates})
    # 合并原始变更记录,匹配对应日期的状态
    merged = issue_date_df.merge(group, on='变更日期', how='left')
    merged['Issue_Id'] = issue_id
    # 向前填充缺失的状态值,继承上一次的状态
    merged[['status', 'Due_Date', 'estimation_hour']] = merged[['status', 'Due_Date', 'estimation_hour']].ffill()
    snapshot_list.append(merged)

# 合并所有快照结果
final_snapshots = pd.concat(snapshot_list, ignore_index=True)

3. 无循环优化版(超大规模数据适用)

如果数据量极大,可通过透视表+向量化填充彻底避免循环,进一步提升效率:

# 转换为宽格式:索引为日期,列为Issue+字段
wide_format = df.pivot_table(
    index='变更日期',
    columns='Issue_Id',
    values=['status', 'Due_Date', 'estimation_hour'],
    aggfunc='last'
)

# 对所有Issue的字段执行向前填充
wide_format = wide_format.ffill()

# 转换回长格式的快照
final_snapshots = wide_format.stack(level='Issue_Id').reset_index()

关键注意事项

  • 如果Issue存在初始状态(创建时未产生变更记录),需将初始状态作为最早日期的记录加入原始DataFrame,再执行上述步骤。
  • ffill()会自动继承上一次的有效状态,确保每个日期的快照都是该Issue的最新状态。
  • 所有操作均基于Pandas底层优化的向量化接口,效率比逐行迭代高10~100倍(数据量越大,优势越明显)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:52:39