循环批量转换DataFrame分类列为序数/数值类型报错求助
批量生成DataFrame分类列的序数映射字典
我明白你遇到的问题了——单独处理一列的时候能拿到正确的映射字典,但批量循环所有object类型列时要么只返回第一列,还触发KeyError:0,没法得到每个列对应的映射字典列表。这大概率是你循环时的逻辑写法出了问题,比如错误地用了索引访问,或者没有正确地把每个列的映射存入列表。
解决步骤和代码示例
首先,我们先明确思路:先筛选出所有object类型的列,然后逐个处理每个列生成映射字典,最后把这些字典收集到列表里。
- 筛选所有object类型的列
# 获取DataFrame中所有object类型的列 object_cols = df_main_correlation.select_dtypes(include=['object']).columns.tolist()
- 初始化列表存储映射字典,循环处理每一列
# 初始化空列表,用来存放每个列的映射字典 replace_maps = [] for col in object_cols: # 将当前列转为category类型,获取所有分类标签 labels = df_main_correlation[col].astype('category').cat.categories.tolist() # 构建当前列的序数映射字典(从1开始计数) replace_map = {col: {k: v + 1 for v, k in enumerate(labels)}} # 将该列的映射字典添加到列表中 replace_maps.append(replace_map)
- 打印结果验证
# 遍历列表,打印每个列的映射字典 for map_item in replace_maps: print(map_item)
运行这段代码后,就能得到你期望的输出:
{'job_level': {'JG03': 1, 'JG04': 2, 'JG05': 3, 'JG06': 4}} {'person_level': {'PG01': 1, 'PG02': 2, ..., 'PG08': 8}} {'Employee_type': {'RM_type_A': 1, 'RM_type_B': 2, 'RM_type_C': 3}}
为什么之前的代码会出错?
你之前的代码触发KeyError:0,很可能是在循环时错误地使用了索引(比如for i in range(len(object_cols))然后用object_cols[i],但构建字典时误写了索引相关的逻辑),或者没有正确地将每个列的映射字典添加到列表,而是每次循环都覆盖了同一个变量,导致最后只保留了第一列的结果。
额外补充:应用映射到DataFrame
如果之后需要把这些序数映射直接应用到原DataFrame,可以用下面的代码:
for replace_map in replace_maps: df_main_correlation = df_main_correlation.replace(replace_map)
内容的提问来源于stack exchange,提问作者ebuzz168
相关产品推荐
相关产品推荐

