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

将DataFrame多列相同标签统一编码为数字的实现方案

我来给你解决这个跨列统一标签编码的问题!你之前尝试的pd.factorize和pd.Categorical默认都是按列独立生成编码的,所以没法实现不同列里的相同标签用同一个数字编码的需求,咱们换个全局处理的思路就能搞定:

跨列全局统一标签编码方案

第一步:构建全局标签-编码映射表

我们需要先把整个DataFrame里所有非-1的唯一值收集起来,给它们分配统一编码,同时保留-1的原值:

import pandas as pd

# 还原你的示例DataFrame
data = {
    'A': ['J969', 'C56', 'R068', 'C56'],
    'B': ['I279', 'A419', 'D65', 'T107'],
    'C': ['D65', 'I279', 'N009', 'J969'],
    'D': [-1, 'C221', -1, 'R068'],
    'E': [-1, -1, -1, 'N009']
}
df = pd.DataFrame(data)

# 提取所有非-1的元素,扁平化后取唯一值
all_non_neg_vals = df.mask(df == -1).stack().unique()
# 对全局唯一值进行factorize,生成编码和对应标签
codes, unique_labels = pd.factorize(all_non_neg_vals)
# 构建标签到编码的字典,同时保留-1的映射
label_to_code = {label: code for label, code in zip(unique_labels, codes)}
label_to_code[-1] = -1

第二步:批量替换DataFrame中的值

用applymap把每个元素替换成对应的编码即可:

encoded_df = df.applymap(lambda x: label_to_code[x])

运行后得到的结果完全符合你的要求:

A  B   C   D   E
0  0  3   7  -1  -1
1  1  2   6  15  -1
2  4  7  10  -1  -1
3  1  8   0   4  10

小补充

如果你的-1是字符串类型(比如单元格里是'-1'),只需要把代码里的-1替换成'-1'就可以了,逻辑完全通用。这种方法的核心就是先全局统一分配编码,再批量替换,完美解决跨列同标签同编码的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:15:17