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

如何使用以元组为键的字典重映射Pandas DataFrame中的值?

基于元组键字典的Pandas DataFrame重映射方案

原始数据与需求

原始数据集

import pandas as pd
# original dataset
data_original = {'ID':['ID_1','ID_1','ID_2','ID_3'],'FIELD_1':[4,4,2,7],'FIELD_2':[5,5,6,1]}
df_original = pd.DataFrame(data_original)

映射规则字典

# 键为元组的映射字典:元组第一个元素匹配ID值,第二个指定要替换的列名,值为替换内容
remap_dictionary = {('ID_1','FIELD_2'):9}

期望结果

# 重映射后的目标数据
data_new = {'ID':['ID_1','ID_1','ID_2','ID_3'],'FIELD_1':[4,4,2,7],'FIELD_2':[9,9,6,1]}
df_new = pd.DataFrame(data_new)

需求说明

需使用以元组为键的字典对Pandas DataFrame进行重映射:元组第一个元素匹配目标行的ID值,第二个元素指定需替换值的列名,字典对应值为替换内容。例如将ID列值为ID_1的所有行中,FIELD_2列的值替换为9。

实现方法

方法一:遍历字典直接赋值(直观易懂)

通过遍历映射字典的每个键值对,利用df.loc同时定位行和列进行赋值,是最直接的实现方式:

import pandas as pd

# 初始化原始数据
data_original = {'ID':['ID_1','ID_1','ID_2','ID_3'],'FIELD_1':[4,4,2,7],'FIELD_2':[5,5,6,1]}
df_original = pd.DataFrame(data_original)

remap_dictionary = {('ID_1','FIELD_2'):9}

# 遍历映射字典执行替换
for (id_val, col_name), new_val in remap_dictionary.items():
    df_original.loc[df_original['ID'] == id_val, col_name] = new_val

# 查看结果
print(df_original)

运行后输出结果与期望的df_new完全一致。

方法二:批量处理(适用于大量映射规则)

如果映射规则较多,可先将字典转换为DataFrame,再通过匹配方式批量替换,效率更高:

import pandas as pd

df_original = pd.DataFrame({'ID':['ID_1','ID_1','ID_2','ID_3'],'FIELD_1':[4,4,2,7],'FIELD_2':[5,5,6,1]})
remap_dictionary = {('ID_1','FIELD_2'):9}

# 将映射字典转为DataFrame
remap_df = pd.DataFrame([(k[0], k[1], v) for k, v in remap_dictionary.items()], 
                        columns=['ID', 'col', 'new_val'])

# 遍历每个需要替换的列
for col in remap_df['col'].unique():
    # 筛选当前列的映射规则
    col_remap = remap_df[remap_df['col'] == col].set_index('ID')['new_val']
    # 用map替换,不存在映射的保留原值
    df_original[col] = df_original['ID'].map(col_remap).fillna(df_original[col])

print(df_original)

这种方法适合映射规则数量较多的场景,避免多次循环。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:05:09