如何使用以元组为键的字典重映射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_
相关产品推荐
相关产品推荐

