在对数据进行预处理时,有时会面临特征值是字符串类型的时候,这时候就需要对特征值进行编码处理,主要分为一下两类:

  • 各个特征值之间没有任何关联,如['red', 'green', 'blue']。
  • 各个特征值之间有关系,如['Excellent', 'Good', 'Normal', 'Bad']。

下面分别说一下如何对以上两种类型数据进行编码处理:

拿kaggle中的House Price数据来举例说明。

import pandas as pddf = pd.read_csv('./data/train.csv')
columns = ['MSZoning','ExterQual']
df_used = df[columns]
print(df_used)

使用到的两列的意义分别如下,很明显MSZoning是没有任何关联的,而ExterQual是对房屋材质进行的评价,是有等级划分的。

MSZoning: Identifies the general zoning classification of the sale.A AgricultureC    CommercialFV    Floating Village ResidentialI   IndustrialRH    Residential High DensityRL  Residential Low DensityRP   Residential Low Density ParkRM  Residential Medium DensityExterQual: Evaluates the quality of the material on the exteriorEx    ExcellentGd GoodTA  Average/TypicalFa   FairPo  Poor

一、各个特征值之间没有任何关联

下面通过四种方法来处理这类问题。

1、pd.get_dummies()

看下源码:作用是将categorical变量转换为指标型变量。

def get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False,columns=None, sparse=False, drop_first=False):"""Convert categorical variable into dummy/indicator variablesParameters----------data : array-like, Series, or DataFrameprefix : string, list of strings, or dict of strings, default NoneString to append DataFrame column namesPass a list with length equal to the number of columnswhen calling get_dummies on a DataFrame. Alternativly, `prefix`can be a dictionary mapping column names to prefixes.prefix_sep : string, default '_'If appending prefix, separator/delimiter to use. Or pass alist or dictionary as with `prefix.`dummy_na : bool, default FalseAdd a column to indicate NaNs, if False NaNs are ignored.columns : list-like, default NoneColumn names in the DataFrame to be encoded.If `columns` is None then all the columns with`object` or `category` dtype will be converted.sparse : bool, default FalseWhether the dummy columns should be sparse or not.  ReturnsSparseDataFrame if `data` is a Series or if all columns are included.Otherwise returns a DataFrame with some SparseBlocks... versionadded:: 0.16.1drop_first : bool, default FalseWhether to get k-1 dummies out of n categorical levels by removing thefirst level... versionadded:: 0.18.0Returns-------dummies : DataFrame or SparseDataFrame
df_used = pd.get_dummies(df_used, columns=['MSZoning'])
print(df_used.head())
  ExterQual  MSZoning_C (all)  MSZoning_FV  MSZoning_RH  MSZoning_RL  \
0        Gd               0.0          0.0          0.0          1.0
1        TA               0.0          0.0          0.0          1.0
2        Gd               0.0          0.0          0.0          1.0
3        TA               0.0          0.0          0.0          1.0
4        Gd               0.0          0.0          0.0          1.0   MSZoning_RM
0          0.0
1          0.0
2          0.0
3          0.0
4          0.0  

从结果来看,它为每一个单独的列特征创建了一个单独的列,并进行了one-hot编码。 另外,直接对dataframe转换的话,每个列名之前都会有之前列名作为前缀。

2、sklearn.preprocessing.LabelEncoder

熟悉sklearn的话应该用过sklearn.preprocessing.OneHotEncoder,然而OneHotEncoder只能对数值类型进行编码,而LabelEncoder可以对字符类型进行编码处理。

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
result = le.fit_transform(df_used['MSZoning'])
df_used['MSZoning'] = result
print(df_used.head())

这里会报一个copy的warn:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

不过没有什么影响,结果如下。

      MSZoning ExterQual
0            3        Gd
1            3        TA
2            3        Gd
3            3        TA
4            3        Gd
5            3        TA

3、使用map函数

通过enumerate内置函数来为列属性中的所有值建立索引,然后将索引来代替之前的值。

map_MSZoning = {key : value for value, key in enumerate(set(df['MSZoning']))}
df_used['MSZoning'] = df_used['MSZoning'].map(map_MSZoning)
print(df_used.head())
  MSZoning ExterQual
0         2        Gd
1         2        TA
2         2        Gd
3         2        TA
4         2        Gd

4、使用pd.factorize()

pd.factorize()不像pd.get_dummies()那样将一个特征映射为多个特征,而只是对该特征内的特征值进行编码。

def factorize(values, sort=False, order=None, na_sentinel=-1, size_hint=None):"""Encode input values as an enumerated type or categorical variableParameters----------values : ndarray (1-d)Sequencesort : boolean, default FalseSort by valuesna_sentinel : int, default -1Value to mark "not found"size_hint : hint to the hashtable sizerReturns-------labels : the indexer to the original arrayuniques : ndarray (1-d) or Indexthe unique values. Index is returned when passed values is Index orSeriesnote: an array of Periods will ignore sort as it returns an always sortedPeriodIndex"""
df['MSZoning'] = pd.factorize(df['MSZoning'])[0]
print(df['MSZoning'])

二、各个特征值之间具有一定关系

通过map函数映射。

map_ExterQual = {'Ex':5, 'Gd':4, 'TA':3, 'Fa':2, 'Po':1}
df_used['ExterQual'] = df_used['ExterQual'].map(map_ExterQual)
print(df_used.head())
  MSZoning  ExterQual
0       RL          4
1       RL          3
2       RL          4
3       RL          3
4       RL          4

数据分析——数据清洗之文字特征编码相关推荐

  1. 大数据分析数据清洗的价值和意义

    在这个由物联网(IoT),社交媒体,边缘计算以及越来越多的计算能力(如量子计算)支持的数字时代,数据可能是任何企业最有价值的资产之一.正确(或不正确)的数据管理将对企业的成功产生巨大影响.换句话说,它 ...

  2. 数据分析--数据清洗详解流程

    无论是做机器学习还是做数据分析,都离不开获取数据后的第一步-数据清洗工作.据统计,数据清洗工作占据整个工作时间百分之50左右,有的甚至能达到百分之70.下面我将介绍我进行数据清洗得思路流程. 数据清洗 ...

  3. 动手学数据分析 | 数据清洗及特征处理(二)

    接上篇动手学数据分析 | 数据基础操作(一),下面代码为本篇内容的基本代码准备工作. import numpy as np import pandas as pddf = pd.read_csv('t ...

  4. 3_数据分析—数据清洗及特征处理

    文章目录 一.数据导入 二.数据清洗简述 2.1 缺失值-观察与处理 2.1.1 缺失值观察(2种方法) 2.1.2 对缺失值进行处理 2.1.3 对缺失值进行填充 2.2 重复值-观察与处理 2.2 ...

  5. 数据分析----数据清洗

    一.导入数据 import pandas as pd import numpy as np from pandas import Series,DataFrame import xlrd df = D ...

  6. 旅游网站大数据分析 - 数据清洗

    第1关:清洗HTML文档中无意义数据 将获取到携程网的城市酒店的HTML数据(包含了所有元素)进行清洗,得到我们需要的标签数据. package step1;import java.io.File; ...

  7. javaweb解决编码问题_停止尝试编码解决问题的方法

    javaweb解决编码问题 抽象 (Abstract) Here's the situation. I need to build a test harness to verify that when ...

  8. python数据清理的实践总结_Python数据清洗实践

    原标题:Python数据清洗实践 DATA CLEANING WITH PYTHON 作者 | Balogun Omobolaji 翻译 | 酱番梨.祝弟弟基督教 校对 | Pita 审核 | 约翰逊 ...

  9. pandas用众数填充缺失值_python数据分析包|Pandas-02之缺失值(NA)处理

    本篇详解pandas中缺失值(Missing data handling)处理常用操作. 缺失值处理常用于数据分析数据清洗阶段:Pandas中将如下类型定义为缺失值: NaN: '', '#N/A', ...

最新文章

  1. 原来腾讯面试题也不难,面试官:给我说一下你理解的分布式架构?
  2. python程序运行时间计时软件_python 计时程序运行时间
  3. 利用辗转相除法计算最大公约数
  4. YBTOJ洛谷P1407:稳定婚姻(强连通分量)
  5. mysql查看sql代价_mysql 代价
  6. webpack4.0各个击破(3)—— Assets篇
  7. 吴恩达深度学习1.4练习_Neural Networks and Deep Learning
  8. 逻辑数据库设计 - 单纯的树(邻接表、路径枚举、嵌套集、闭包表)(引)
  9. aspnet还有人用吗_微信公众号软件安装管家会员真的那么好吗
  10. Silverlight 获得鼠标位置
  11. iPhone 12 要来了,手机是时候换到 11 了
  12. C语言C++编程软件推荐及下载方式
  13. 保险场景化与场景即保险——新保险
  14. 材料科学基础考研计算机,2017年西安工业大学计算机学院805材料科学基础考研仿真模拟题...
  15. OpenGL 纹理基础与索引
  16. 浅析LruCache原理
  17. 我的首个电子书软件--嘎嘎读书 的开发(四)
  18. maven工程提示pom.xml无法解析org.apache.maven.plugins:maven-resources-...
  19. 微信如何直接跳转外部浏览器
  20. 华为鸿蒙电视可以装软件吗,华为智慧屏V系列可以安装第三方软件吗?分享安装当贝市场教程...

热门文章

  1. Java设计模式之装饰模式(透明装饰模式,半透明装饰模式)
  2. 通达信小股民MACD二次金叉三全项柱面积指标公式 源码 副图
  3. QNX演示自动在CES 2016驱动模块-QNX自动驾驶
  4. [论文记录] 2019 - Utilizing Arousal-Valence Relationship for Continuous Prediction of Valence in Movies
  5. win7计算机里桌面菜单没有反应,win7系统鼠标右键点击桌面没反应怎么办 鼠标右键没反应解决方法...
  6. 渗透武器库---信息收集工具大全
  7. 【BMI指数计算器V2.0】项目实战
  8. 直流电路中升降压(Buck-Boost)变换电路的设计、参数选取及Matlab/Simulik仿真
  9. 《蚂蚁塔防》Antbuster
  10. 免费药店收银系统哪个好?