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

Python pandas如何用groupby分组追踪多列变化新增标识列

合同变更类型标注实现方案

核心逻辑

针对每个Contract_Id对应2条版本记录的结构,按合同ID分组后,分别判断合同价值、到期日两个字段在组内是否存在多个不同取值,匹配对应变更类型后给组内所有记录统一打标签。变更类型共4类:

  • 合同价值变更:仅合同价值字段存在差异
  • 到期日变更:仅到期日字段存在差异
  • 两者均变更:两个字段都存在差异
  • 两者均无变更:两个字段取值完全一致

可直接运行的代码

import pandas as pd

# --------------------------
# 这里替换成你自己的DataFrame读取逻辑
# 示例测试数据构造
df = pd.DataFrame({
    'Contract_Id': ['C001', 'C001', 'C002', 'C002', 'C003', 'C003', 'C004', 'C004'],
    'Contract Value': [10000, 12000, 50000, 50000, 30000, 35000, 20000, 20000],
    'Expiry Date': ['2025-12-31', '2025-12-31', '2024-06-30', '2025-06-30', '2024-03-15', '2025-03-15', '2026-01-01', '2026-01-01']
})
# --------------------------

def mark_change_status(group_df):
    # 统计字段唯一值数量,大于1说明存在变更;字段含空值时请给nunique传入dropna=False参数
    is_value_change = group_df['Contract Value'].nunique() > 1
    is_expiry_change = group_df['Expiry Date'].nunique() > 1

    if is_value_change and is_expiry_change:
        group_df['Change'] = '两者均变更'
    elif is_value_change:
        group_df['Change'] = '合同价值变更'
    elif is_expiry_change:
        group_df['Change'] = '到期日变更'
    else:
        group_df['Change'] = '两者均无变更'
    return group_df

# 分组打标
df = df.groupby('Contract_Id', group_keys=False).apply(mark_change_status)

补充说明

  • 上述代码执行后,同一Contract_Id下的2条记录会标注完全相同的变更类型,和需求要求的输出逻辑一致
  • 如果需要区分变更方向(比如合同价值上涨/下跌、到期日提前/延后),可以在分组内先按合同版本生成时间排序,取前后两条记录做差值判断后扩展标签规则即可
  • 日期字段建议提前转成datetime类型,避免字符串格式不一致导致的判断误差,转换命令参考:df['Expiry Date'] = pd.to_datetime(df['Expiry Date'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:27:20