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

循环批量转换DataFrame分类列为序数/数值类型报错求助

批量生成DataFrame分类列的序数映射字典

我明白你遇到的问题了——单独处理一列的时候能拿到正确的映射字典,但批量循环所有object类型列时要么只返回第一列,还触发KeyError:0,没法得到每个列对应的映射字典列表。这大概率是你循环时的逻辑写法出了问题,比如错误地用了索引访问,或者没有正确地把每个列的映射存入列表。

解决步骤和代码示例

首先,我们先明确思路:先筛选出所有object类型的列,然后逐个处理每个列生成映射字典,最后把这些字典收集到列表里。

  1. 筛选所有object类型的列
# 获取DataFrame中所有object类型的列
object_cols = df_main_correlation.select_dtypes(include=['object']).columns.tolist()
  1. 初始化列表存储映射字典,循环处理每一列
# 初始化空列表,用来存放每个列的映射字典
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)
  1. 打印结果验证
# 遍历列表,打印每个列的映射字典
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:01:03