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

Pandas如何按条件匹配现有列值映射生成新列

问题根因

你传入map方法的映射字典中,每个键对应的值是整列Series对象。Series.map的执行逻辑是匹配到键后直接返回对应的映射值,不会自动做行对齐的单行取值,因此匹配到对应季度键时,会把整个分数列的Series对象直接填入所有匹配行的单元格,最终出现单元格存储全量序列的异常。

可落地实现方案

以下三种写法都能准确实现逐行取对应季度分数的需求:

  • 条件匹配方案(无版本兼容问题,逻辑清晰)
    借助numpy.select按季度条件匹配对应分数列,可读性和运行效率表现均衡:
import numpy as np

df['quarter_score'] = np.select(
    condlist=[
        df['quarter'] == 'q1',
        df['quarter'] == 'q2',
        df['quarter'] == 'q3',
        df['quarter'] == 'q4'
    ],
    choicelist=[
        df['q1_score'],
        df['q2_score'],
        df['q3_score'],
        df['q4_score']
    ]
)
  • 动态列索引方案(性能最优,适配大数据量场景)
    目标分数列名可直接由quarter字段值拼接_score后缀得到,通过numpy按位置索引取值,无逐行循环开销,适合百万行以上规模的数据集:
import numpy as np

target_col_names = df['quarter'] + '_score'
target_col_index = df.columns.get_indexer(target_col_names)
df['quarter_score'] = df.to_numpy()[np.arange(len(df)), target_col_index]
  • 逐行取值方案(代码简洁,适配小数据量场景)
    如果数据集规模在万行以内,可以直接用apply逐行取值,代码书写成本最低:
df['quarter_score'] = df.apply(lambda row: row[f"{row['quarter']}_score"], axis=1)

提示:旧版Pandas提供的DataFrame.lookup方法也可实现该需求,但该方法自Pandas 1.2.0版本起已被标记为弃用,新版本环境运行会抛出警告,不建议使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:54:29