Python:如何将字典列表特征缩放后对应原键重构新字典?
解决Enron数据集特征缩放后重建字典的问题
我看你现在的问题是特征缩放后没法把数据正确映射回原字典对吧?核心问题是你没把缩放后的数组和原数据的键(key)、**特征列表(my_features)**的对应关系理清楚,咱们一步步来修正:
问题根源
你之前把所有特征值提取成list_of_values,缩放后得到rescaled_data,但没把这个二维数组的每一行(对应一个员工的数据)和原字典的key绑定,也没把每行里的元素(对应每个特征的缩放值)和my_features里的特征一一对应,所以才会生成全相同值的字典。
修正步骤
1. 先保留键的顺序
在提取keys的时候,把它转换成列表(避免遍历顺序出问题):
keys = list(data_dict.keys()) # 显式存为列表,确保和后续数据顺序一致
2. 把缩放后的数据映射回原字典
在得到rescaled_data之后,通过索引一一对应键和特征:
# 遍历每个key和对应的缩放后数据行 for idx, employee_key in enumerate(keys): # 获取当前员工的缩放后特征值数组 scaled_features = rescaled_data[idx] # 遍历每个特征和对应的缩放值 for feature_idx, feature_name in enumerate(my_features): # 替换原字典中该员工的对应特征值 data_dict[employee_key][feature_name] = scaled_features[feature_idx]
可选:创建新字典(不修改原数据)
如果不想改动原始的data_dict,可以先深拷贝一份再修改:
from copy import deepcopy # 深拷贝原字典,避免修改原始数据 new_data_dict = deepcopy(data_dict) # 遍历替换新字典的值 for idx, employee_key in enumerate(keys): scaled_features = rescaled_data[idx] for feature_idx, feature_name in enumerate(my_features): new_data_dict[employee_key][feature_name] = scaled_features[feature_idx]
额外注意点
- 你之前把
poi(布尔值)转成了float,MinMaxScaler对0/1的缩放结果还是0/1,不会影响后续分析 - 如果
my_features里有部分特征在某些员工的字典中不存在,记得保留你之前的try-except逻辑,或者提前过滤掉缺失特征的条目 - 确保
list_of_values的生成顺序和keys的顺序完全一致,这样rescaled_data的每一行才能准确对应到每个员工
内容的提问来源于stack exchange,提问作者djw
相关产品推荐
相关产品推荐

