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

如何基于另一列数据在Pandas中动态选列并映射值

问题描述

现有两个DataFrame:
df1:

date_time | value1 | column_value
12-Mar-22   17345      17200CE
13-Mar-22   17400      17200PE
....

df2:

date_time | value1 | 17200CE | 17200PE | 17300CE | .......
12-Mar-22   17345    23.3      21.2      24.5
13-Mar-22   17345    24.3      22.2      22.5

需要在df1中新增一列mapped_value_result,规则是:根据df1的column_value列的值,匹配df2中对应列名,同时取同一date_time行的数据,最终得到如下结果:

date_time | value1 | column_value | mapped_value_result
12-Mar-22   17345    17200CE           23.3
13-Mar-22   17345    17200PE           22.2
解决方案

方法1:用df.lookup(适合pandas 2.0以下版本)

lookup可以直接按行索引和列名匹配取值,步骤如下:

# 把df2的date_time设为索引,方便按日期匹配
df2_indexed = df2.set_index('date_time')
# 从df1中提取日期和列名,在df2中查找对应值
df1['mapped_value_result'] = df2_indexed.lookup(df1['date_time'], df1['column_value'])

注意:pandas 2.0及以上版本已弃用lookup,建议用下面的方法。

方法2:merge + melt(通用兼容版)

把df2的宽表转成窄表,再和df1合并,兼容性拉满:

# 将df2的多列转成键值对形式
df2_melted = df2.melt(
    id_vars=['date_time', 'value1'],
    var_name='column_value',
    value_name='mapped_value_result'
)
# 按日期和column_value合并两个表
result_df = df1.merge(df2_melted, on=['date_time', 'column_value'], how='left')
# 保留df1原有的value1列,删除合并带来的重复列
result_df = result_df.drop('value1_y', axis=1).rename(columns={'value1_x': 'value1'})

方法3:apply逐行匹配(适合小数据集)

逻辑简单直观,但大数据集下效率偏低:

def get_match_value(row):
    # 找到df2中同日期的行,取出对应列的值
    match_row = df2[df2['date_time'] == row['date_time']]
    return match_row[row['column_value']].values[0] if not match_row.empty else None

df1['mapped_value_result'] = df1.apply(get_match_value, axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:25:25