利用pandas将非数值数据转换成数值的方式

晚来风
晚来风
发布时间:2026-10-12| 3人浏览过
原创

本文介绍在Python中使用pandas和sklearn将非数值数据转换为数值的方法。通过自定义函数处理类别列,并对比LabelEncoder的使用。文中指出直接操作DataFrame时的常见陷阱,如列顺序重置和字典映射逻辑,并提供基于LabelEncoder的更简洁实现方案,适用于机器学习前的数据预处理阶段。

处理非数值型数据

以性别属性为例,将“男”和“女”转换为0和1。熟悉机器学习的读者可以跳过此部分。

此处暂不考虑稀疏向量的应用场景,仅提供一种思路。原本尝试直接使用pandas的DataFrame.iloc结合for循环进行转换,但测试后发现原数据并未发生实际改变,因此编写了一个较为基础的函数,代码如下。

# 非数值列处理函数
def handel_non_numerical_data(df,name): #----------------name是需要处理的列名称(str),暂不考虑列表
 nrows = len(df[name])  #----------------数据集的行数
 old_col = df.columns.tolist() #----------------初始的列名集合
 name_index = old_col.index(name) #---------要处理的列的在数据集中的索引值
 name_data = df[name].values.tolist()#-----------将要处理烦人列复制成一个列表
 df.drop([name],axis =1,inplace =True) 
 unique_kinds = set(name_data)
 convert_dict = {}; x = 0   #构造对应种类数值转化字典
 for i in unique_kinds:
 convert_dict[i] = x
 x += 1
 def convert(val):
 return convert_dict[val] 
 name_data = list(map(convert,name_data))#利用map函数直接迭代转化
 
 new_col = df.columns.tolist()
 new_col.insert(name_index,name)
 df.reindex(columns = new_col) #----------------重构数据的列
 df[name] = name_data

运行该函数未出现错误,但需注意这仅作为基线(baseline)参考。若对数值转换的精度或方式有特定要求,需根据实际场景自行调整代码。

最初参考了YouTube上sentdex老师的机器学习第35期视频中的代码,但发现其中存在几个较为严重的Bug,且运行时常报错,具体表现如下。

def handle_non_numerical_data(df):
 columns = df.columns.values
 for column in columns:
 text_digit_vals = {}
 def convert_to_int(val):
  return text_digit_vals[val]
 if df[column].dtype != np.int64 and df[column].dtype != np.float64:
  column_content = df[column].values.tolist()
  unique_elements = set(column_content)
  print(unique_elements)
  x =0
  for unique in unique_elements:
  if unique not in text_digit_vals:
   text_digit_vals[unique] = x
   x+=1
 df[column] = list(map(convert_to_int,df[column]))

可以看出该实现方式较为暴力。注意其if条件判断,在某些数据集中可能出现字母与数字组合的情况(此时dtype为object)。使用set去重后,类别数量会急剧增加,导致数值转换失去意义。当然,如果样本量达到亿级,几千个类别的影响或许可以忽略,但这种情况建议使用稀疏向量处理。此外,该代码一直报错,原因不明,有兴趣的读者可复制运行并协助解答。

---------------------------2019-08-21分割线:

https://www.kaggle.com/nroman/recursive-feature-elimination

使用LabelEncoder方法

from sklearn.preprocessing import LabelEncoder

注:tqdm为进度条库,无需关注。此外未深入查看该接口的源码,推测其实现原理类似于One-Hot编码。

以上关于利用pandas将非数值数据转换成数值的方法即为分享的全部内容,希望能对大家有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。