如何在Pandas中将含重复值的字符串列转换为连续数字?
将字符串列转换为连续数字编码的方法
嘿,这个需求在可视化场景里太常见了!不用头疼虚拟变量,pandas自带两个简单的工具就能搞定,直接把重复的字符串列转成从0开始的连续数字,完美适配散点图的需求。
方法1:用pd.factorize()(按首次出现顺序编码)
这个方法会自动识别列中的唯一值,按照它们首次出现的顺序分配0、1、2...这样的连续编码,非常直观。
举个具体的例子:
import pandas as pd # 构造你的示例DataFrame df = pd.DataFrame({'col': ["1120", "2230", "1120", "1234"]}) # 执行编码,取返回结果的第一个元素(编码后的数组) df['encoded_col'] = pd.factorize(df['col'])[0]
执行后你的DataFrame会变成这样:
col encoded_col 0 1120 0 1 2230 1 2 1120 0 3 1234 2
可以看到,每个唯一字符串都被映射成了连续的数字,完全符合你的要求。
方法2:用分类类型的cat.codes(可自定义编码顺序)
如果你希望编码顺序是按照字符串的自然排序(比如"1120"<"1234"<"2230"),可以先把列转为category类型,再提取编码:
# 先转成分类类型,默认按字符串排序分配编码 df['encoded_col'] = df['col'].astype('category').cat.codes
如果想手动指定编码顺序,也可以这样:
# 自定义唯一值的顺序,比如按["2230", "1120", "1234"]来编码 custom_order = ["2230", "1120", "1234"] df['encoded_col'] = df['col'].astype(pd.CategoricalDtype(categories=custom_order, ordered=True)).cat.codes
这样"2230"会被编码为0,"1120"为1,"1234"为2,灵活性更高。
为什么不用虚拟变量?
虚拟变量(one-hot编码)会把每个类别转成单独的二进制列,这更适合机器学习的特征输入,但对于散点图来说,你需要的是单个连续数值列来做坐标轴或颜色映射,上面两种方法显然更贴合需求。
内容的提问来源于stack exchange,提问作者Jonah Kornberg
相关产品推荐
相关产品推荐

