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

Pandas高效映射含元组类型键的DataFrame至目标DataFrame

解决DataFrame中含元组类型key的映射问题

需求说明

需要将df2的数值列映射到df1,核心难点是df1的key字段既包含单个字符串,也包含多元素元组;映射后对应Val列的值需与key类型匹配——单个字符串对应单个值,元组对应同结构的数值元组。

修正后的示例数据

原示例代码存在语法错误,先修正为可运行版本:

import pandas as pd

df1 = pd.DataFrame(data={
    'Index': [1,2,3,4,5,6,7,8],
    'key': ['a','a','b',('a','c'),'c',('a','b','c'),'b','a']
})

df2 = pd.DataFrame(data = {
    'Index': ['a','b','c'],
    'Val1': [1,2,3],
    'Val2': [.1,.2,.3],
    'Val3': [10,20,30],
    'Val4': [1,2,3],
    'Val5': [2,4,6]
})

高效映射方案

步骤1:构建映射字典

先将df2转换为以Index为键、包含所有Val列的字典,实现快速查找:

# 构建映射字典,key为df2的Index值,value为对应所有Val列的字典
map_dict = df2.set_index('Index').to_dict('index')

步骤2:定义映射函数

针对df1的key类型(字符串/元组),返回对应结构的数值:

def map_key_values(key, col_name):
    if isinstance(key, tuple):
        # 若key是元组,遍历每个元素取对应列值,组成元组返回
        return tuple(map_dict[k][col_name] for k in key)
    else:
        # 若key是单个字符串,直接返回对应列值
        return map_dict[key][col_name]

步骤3:批量生成映射列

对每个Val列应用映射函数,生成最终结果:

# 筛选所有Val列,批量生成映射后的列
val_cols = [col for col in df2.columns if col.startswith('Val')]
for col in val_cols:
    df1[col] = df1['key'].apply(lambda x: map_key_values(x, col))

# 提取需求指定的列
result = df1[['key'] + val_cols]

最终结果

运行后result的输出如下:

keyVal1Val2Val3Val4Val5
a10.11012
a10.11012
b20.22024
('a', 'c')(1, 3)(0.1, 0.3)(10, 30)(1, 3)(2, 6)
c30.33036
('a','b','c')(1,2,3)(0.1,0.2,0.3)(10,20,30)(1,2,3)(2,4,6)
b20.22024
a10.11012

方案优势

  • 利用字典实现O(1)级别的查找,效率远高于多次merge操作
  • 函数逻辑清晰,可灵活适配不同长度的元组key
  • 批量处理所有Val列,避免重复代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 06:54:25