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
相关产品推荐
相关产品推荐

