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

如何在Pandas中按条件对PON列值递增?附字典映射场景

问题需求

需要实现以下逻辑处理DataFrame的PON列:

  • 以LID为键,从refrence_dict中获取对应初始值填充PON列的基础值;
  • 当满足条件(df['Mode'].shift(1) != 'SD') & (df['Mode'] == 'SD')时(即当前行是SD且上一行不是SD),PON列的值在当前基础上递增1;
  • 其余行保持PON列的当前值不变。

原尝试代码使用cumsum方法,但该方法会累加初始值而非每次递增1,无法实现需求,寻求正确实现方式。


示例数据

import pandas as pd
import numpy as np

refrence_dict={'A': 100, 'B': 80, 'C': 30, 'D': 400}
df0 = pd.DataFrame({'LID': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'], 
                     'Mode': ['FS', 'SD', 'SD', 'FS', 'SD', 'SD', 'FS', 'FS', 'FS', 'SD', 'SD', 'FS', 'SD', 'SD', 'FS']})

原代码问题分析

原代码中process_1将初始值PON_tmp赋值给触发条件的行,后续op_cumsum直接累加这些初始值,导致结果是初始值的重复相加(比如A组两次触发会得到100+100=200),而非每次递增1,完全不符合需求。


正确实现思路

  1. 先通过LID映射字典获取每组的初始值;
  2. 按LID分组,标记每组内需要触发递增的行;
  3. 对每组内的触发行做累计计数(每次触发加1),将累计值加到初始值上,得到最终PON值。

完整实现代码

import pandas as pd
import numpy as np

refrence_dict={'A': 100, 'B': 80, 'C': 30, 'D': 400}
df0 = pd.DataFrame({'LID': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'], 
                     'Mode': ['FS', 'SD', 'SD', 'FS', 'SD', 'SD', 'FS', 'FS', 'FS', 'SD', 'SD', 'FS', 'SD', 'SD', 'FS']})

def process_pon(df, ref_dict):
    # 1. 填充初始值
    df['PON'] = df['LID'].map(ref_dict)
    
    # 2. 分组处理递增逻辑
    def group_handler(group):
        # 标记需要递增的行
        incr_trigger = (group['Mode'].shift(1) != 'SD') & (group['Mode'] == 'SD')
        # 计算累计递增量:首次触发加1,第二次加2,以此类推
        incr_counts = incr_trigger.cumsum()
        # 初始值叠加累计递增量
        group['PON'] += incr_counts
        return group
    
    # 应用分组逻辑
    return df.groupby('LID', group_keys=False).apply(group_handler)

# 执行处理并输出结果
df1 = process_pon(df0, refrence_dict)
print(df1)

输出结果

LID Mode  PON
0    A   FS  100
1    A   SD  101
2    A   SD  101
3    A   FS  101
4    A   SD  102
5    B   SD   81
6    B   FS   81
7    B   FS   81
8    B   FS   81
9    B   SD   82
10   C   SD   31
11   C   FS   31
12   C   SD   32
13   C   SD   32
14   C   FS   32

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:05:14