如何根据另一DataFrame的列值为Pandas DataFrame新增符合规则的列
问题修正方案
你原有代码的问题是没有针对flag字段的不同取值做分支逻辑判断,只实现了Y/U对应的查找规则。以下是可直接运行的修正后代码:
import pandas as pd # 示例数据 df1 = pd.DataFrame({ 'no': ['abc1', 'abc2', 'abc3'], 'plan': [249, 249, 249], 'current': [30, 30, 30], 'flag': ['Y/U', 'N', 'Y/D'] }) df2 = pd.DataFrame({ 'plan': [149, 249, 349], 'offer': [20, 30, 40] }) # 先对df2的offer值排序,保证查找相邻值的逻辑稳定 sorted_offers = sorted(df2['offer'].tolist()) def calc_pos(row): current = row['current'] flag = row['flag'] if flag == 'N': return current elif flag == 'Y/U': # 找比current大的最小offer值 higher_offers = [o for o in sorted_offers if o > current] return min(higher_offers) if higher_offers else current elif flag == 'Y/D': # 找比current小的最大offer值 lower_offers = [o for o in sorted_offers if o < current] return max(lower_offers) if lower_offers else current df1['Pos'] = df1.apply(calc_pos, axis=1) print(df1)
运行后输出结果和预期完全一致:
no plan current flag Pos 0 abc1 249 30 Y/U 40 1 abc2 249 30 N 30 2 abc3 249 30 Y/D 20
优化说明
- 提前排序
offer列,避免因为df2行顺序变动导致查找结果出错 - 用自定义函数替代匿名lambda,分支逻辑更清晰,可读性和可维护性更高
- 增加了兜底逻辑,如果没有找到符合要求的offer值,默认返回当前
current值,避免出现None异常
内容的提问来源于stack exchange,提问作者Manglu
相关产品推荐
相关产品推荐

