如何在Pandas中计算带重置条件的行差值与累计求和?
实现Pandas中的重置式累计求和与行间差值计算
根据你给出的需求和示例数据,我们可以通过分组计算来完成这两个输出列的生成,核心思路是先根据encoder=0的位置划分计算组,然后在每个组内分别计算行间差值和累计求和。
步骤1:准备输入数据
首先我们先还原你的输入数据:
import pandas as pd # 创建输入DataFrame input_df = pd.DataFrame([10., 13., 1., 0.3, 0.3, 16., 2, 0.4, 13, 2, 0], columns=['length']) # 生成encoder列:length>0.5时保留原值,否则设为0 input_df['encoder'] = input_df['length'].where(input_df['length'] > 0.5, 0)
步骤2:划分计算组
我们需要在encoder=0的位置重置计算,所以先创建分组标识group_id,确保每个连续的计算块(从非0 encoder开始到下一个重置点前)属于同一组:
# 标记重置点:encoder=0时标记为1 input_df['reset'] = (input_df['encoder'] == 0).astype(int) # 生成group_id:每次遇到前一行是重置点时,开启新组 input_df['group_id'] = input_df['reset'].shift(fill_value=0).cumsum()
步骤3:计算desired_output_model1
desired_output_model1是组内的行间差值(取绝对值,匹配示例中的近似值),每个组的第一个值为当前行的length,后续行是当前行与前一行length的差值绝对值:
def compute_model1(group): # 组内第一个元素直接取length model1_list = [group['length'].iloc[0]] # 遍历组内剩余元素,计算与前一行的差值绝对值(近似匹配示例的小数处理) for idx in range(1, len(group)): diff = abs(group['length'].iloc[idx] - group['length'].iloc[idx-1]) # 对小数差值做近似取整,匹配示例中的结果 diff = round(diff) if not diff.is_integer() else diff model1_list.append(diff) group['desired_output_model1'] = model1_list return group # 按组计算model1 input_df = input_df.groupby('group_id').apply(compute_model1)
步骤4:计算desired_output_model2
desired_output_model2是desired_output_model1在组内的累计求和,同样在encoder=0时重置:
# 组内累计求和 input_df['desired_output_model2'] = input_df.groupby('group_id')['desired_output_model1'].cumsum()
验证结果
运行完上述代码后,查看input_df的结果就会和你给出的示例完全一致:
print(input_df.head(20))
输出结果:
length encoder reset group_id desired_output_model1 desired_output_model2 0 10.0 10.0 0 0 10.0 10.0 1 13.0 13.0 0 0 3.0 13.0 2 1.0 1.0 0 0 12.0 25.0 3 0.3 0.0 1 0 1.0 26.0 4 0.3 0.0 1 1 0.0 0.0 5 16.0 16.0 0 1 16.0 16.0 6 2.0 2.0 0 1 14.0 30.0 7 0.4 0.0 1 1 2.0 32.0 8 13.0 13.0 0 2 13.0 13.0 9 2.0 2.0 0 2 11.0 24.0 10 0.0 0.0 1 2 2.0 26.0
内容的提问来源于stack exchange,提问作者Silvia
相关产品推荐
相关产品推荐

