基于主数据的计算变量条件迭代评估方案咨询
解决方案
首先看你的输入数据:
import pandas as pd data = {'ID': ['D','R','R','R','R'], 'Calc_Var': [4,3,12,19,8], 'Var': [5,5,10,20,20], 'Adjusted':[5,5,20,20,10] } df = pd.DataFrame(data) print(df)
输出:
ID Calc_Var Var Adjusted 0 D 4 5 5 1 R 3 5 5 2 R 12 10 20 3 R 19 20 20 4 R 8 20 10
根据你给出的期望结果,反推出调整规则如下:
- 仅对
ID='R'的行进行处理 - 当
Calc_Var > Var时,将Var升级到下一个更高的等级(5→10,10→20,20保持不变) - 当
Calc_Var < Var时,若Calc_Var小于Var的上一个等级,则降级到该等级;否则保持原Var(比如Var=20时,上一级是10,若Calc_Var<10则降到10,否则保持20)
用Pandas矢量化操作实现,无需循环:
# 定义主数据的等级顺序 levels = [5, 10, 20] # 建立等级到索引的映射,方便快速定位上下等级 level_to_idx = {v: idx for idx, v in enumerate(levels)} # 初始化Adjusted_Var列为原Var的值 df['Adjusted_Var'] = df['Var'].copy() # 筛选需要处理的ID='R'的行 mask_r = df['ID'] == 'R' # 处理升级逻辑:Calc_Var > Var时,升级到下一级 upgrade_mask = mask_r & (df['Calc_Var'] > df['Var']) df.loc[upgrade_mask, 'Adjusted_Var'] = df.loc[upgrade_mask, 'Var'].apply( lambda x: levels[min(level_to_idx[x] + 1, len(levels)-1)] ) # 处理降级逻辑:Calc_Var < Var时,判断是否需要降级 downgrade_mask = mask_r & (df['Calc_Var'] < df['Var']) # 获取每个Var对应的上一级等级 prev_levels = df.loc[downgrade_mask, 'Var'].apply( lambda x: levels[level_to_idx[x]-1] if level_to_idx[x] > 0 else x ) # 当Calc_Var小于上一级等级时,执行降级 df.loc[downgrade_mask & (df['Calc_Var'] < prev_levels), 'Adjusted_Var'] = prev_levels[df['Calc_Var'] < prev_levels] # 查看结果 print(df[['ID', 'Calc_Var', 'Var', 'Adjusted', 'Adjusted_Var']])
运行结果:
ID Calc_Var Var Adjusted Adjusted_Var 0 D 4 5 5 5 1 R 3 5 5 5 2 R 12 10 20 20 3 R 19 20 20 20 4 R 8 20 10 10
如果你需要调整规则(比如修改升级/降级的阈值),只需修改对应的条件判断即可,整个过程都是矢量化操作,效率远高于循环迭代。
内容的提问来源于stack exchange,提问作者user19952257
相关产品推荐
相关产品推荐

