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

如何根据另一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:21:03