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

