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

如何将DeepDiff计算的分组连续行差异结果添加回原DataFrame?

解决方案

你的代码目前存在一个关键问题:differences列表的长度和DataFrame z的行数不匹配。因为每个客户组里,你只计算了从第2行到最后一行的差异(共len(group)-1个值),而每个组的第一行没有对应的前一行数据,所以整个列表的总长度会比z的行数少分组的数量(每个组少1个元素)。要解决这个问题,需要给每个组的第一行补充一个标记值,再将列表添加为新列。

方法一:修正循环逻辑,匹配列表长度

修改循环代码,为每个客户组的第一行添加一个无前置数据的标记,再计算后续行的差异,确保differences长度和z一致:

z = prac_df.sort_values(['customer_id', 'delivery_date'])

grouped = z.groupby('customer_id')
differences = []
for name, group in grouped:
    # 每个组的第一行没有前序数据,添加标记
    differences.append('no previous entry')
    # 从第二行开始计算连续diff列的差异
    for i in range(1, len(group)):
        diff = DeepDiff(group.iloc[i-1]['diff'], group.iloc[i]['diff'])
        differences.append(diff if diff else 'no change')

# 将差异列表作为新列添加到原DataFrame
z['diff_comparison'] = differences

方法二:用pandas groupby apply简化代码

更符合pandas风格的写法,直接在分组内处理并添加新列,无需手动维护外部列表:

def calculate_row_diff(group):
    # 生成差异结果列表,第一行标记无前置数据
    diff_results = ['no previous entry']
    # 遍历组内后续行计算差异
    for idx in range(1, len(group)):
        current_diff = DeepDiff(group.iloc[idx-1]['diff'], group.iloc[idx]['diff'])
        diff_results.append(current_diff if current_diff else 'no change')
    # 为当前组添加新列
    group['diff_comparison'] = diff_results
    return group

# 排序后分组处理,直接得到带新列的DataFrame
z = prac_df.sort_values(['customer_id', 'delivery_date']).groupby('customer_id', group_keys=False).apply(calculate_row_diff)

注:你原代码中group = group.sort_values('delivery_date')可以省略,因为z已经按customer_id和delivery_date排序完成,分组后的每个组自然保持日期有序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:32:38