将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
相关产品推荐
相关产品推荐

