如何在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,完全不符合需求。
正确实现思路
- 先通过
LID映射字典获取每组的初始值; - 按
LID分组,标记每组内需要触发递增的行; - 对每组内的触发行做累计计数(每次触发加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
相关产品推荐
相关产品推荐

