数据分析实战(八):pandas文本数据实战

问题描述

在许多实际的数据处理工作中,数据集通常包含分类变量。这些变量通常存储为表示各种特征的文本值。一些示例包括颜色(“红色”,“黄色”,“蓝色”),尺寸(“小”,“中”,“大”)或地理名称(州或国家)。许多机器学习算法可以支持分类值而无需进一步操作,但还有许多算法不支持。因此,分析师面临的挑战是如何将这些文本属性转换为数值以便进一步处理。

幸运的是,pandas和scikit-learn的python工具提供了几种方法,可用于将分类数据转换为合适的数值。本文将对一些常见的(以及一些更复杂的)方法进行汇总,希望它能帮助其他人将这些技术应用于他们的现实世界问题。

数据集

在本文中,我在UCI机器学习库中找到一个好的数据集。这个特定的汽车数据集包括分类值和连续值的组合,并且作为相对容易理解的有用示例。

import pandas as pd
import numpy as np

# 定义数据的列名称, 因为这个数据集没有包含列名称
headers = ["symboling", "normalized_losses", "make", "fuel_type", "aspiration",
           "num_doors", "body_style", "drive_wheels", "engine_location",
           "wheel_base", "length", "width", "height", "curb_weight",
           "engine_type", "num_cylinders", "engine_size", "fuel_system",
           "bore", "stroke", "compression_ratio", "horsepower", "peak_rpm",
           "city_mpg", "highway_mpg", "price"]

# 读取在线的数据集, 并将?转换为缺失NaN
df = pd.read_csv("http://mlr.cs.umass.edu/ml/machine-learning-databases/autos/imports-85.data",
                  header=None, names=headers, na_values="?")

data = df.head()[df.columns[:10]]
print(data)

在这里插入图片描述
看一下所有列的数据类型
因为我们只关心文本数据, 所以我们选出类型为”object”的列, 而pandas提供了select_dtypes方法可以快速达到目的
因为数据集种包括缺失数据, 这会增加后续处理的难度, 我们为了简单起见, 将缺失值删除即可

print(df.dtypes)
df2 = df.select_dtypes('object').copy()
print(df2.head())

df2.dropna(inplace=True)

在这里插入图片描述
在这里插入图片描述

方案一:替换字符串

最简单的方式就是, 查找列中所有的字符串, 然后给不同的字符串一个编号, 然后用编号替换字符串。
使用vlaue_counts获取所有的字符串:

# 我们以该列为例:
col = 'body_style'
strs = df2[col].value_counts()
print(strs)

print('\n')
value_map = dict((v, i) for i, v in enumerate(strs.index))
print(value_map)

print('\n')
df2.replace({col: value_map})
print(df2[col].head())

在这里插入图片描述

方案二:标签编码

在这里插入图片描述

# 我们以该列为例:
bs = df2['body_style'].astype('category')
print(bs.head())


# 然后你只需要使用标签的编码作为真正的数据就可以了:
print(bs.cat.codes.head())

在这里插入图片描述

方案三: 转换成哑变量, 或者叫one-hot编码

标签编码的优点是它很简单,但它的缺点是数值可能被算法“误解”。
例如,0的值显然小于4的值,但这是否真的与现实生活中的数据集相对应?在我们的计算中,旅行车的重量是否比敞篷车重4倍?在这个例子中,我不这么认为。所以我们需要将数据转换为哑变量(onehot), 在pandas中, 这个转变只需要一行代码:

data = pd.get_dummies(df['body_style']).head()
print(data)

在这里插入图片描述

方案四: 自定义二分类

根据数据集,您可以使用标签编码和one-hot来创建满足进一步分析需求的二分类列

在此特定数据集中,有一个名为engine_type的列包含几个不同的值:

ret1 = df2['engine_type'].value_counts()
print(ret1)

# 为了便于讨论,我们可能关心的是发动机是否是顶置凸轮(OHC)。
# 换句话说,OHC的各种版本对于该分析都是相同的。
# 如果是这种情况,那么我们可以使用str accessor创建一个新列,指示汽车是否有OHC引擎。

ret2 = df2["engine_type"].str.contains("ohc").map(int).value_counts()
print(ret2)

在这里插入图片描述

Scikit-Learn方法

除了pandas方法,scikit-learn还提供类似的功能。就个人而言,我发现使用pandas有点简单,但我认为重要的是要知道如何在scikit-learn中执行这些过程。

例如,如果我们想对汽车的品牌进行标签编码,我们需要实例化LabelEncoder对象并fit_transform数据:

# 本质就是one-hot编码
from sklearn.preprocessing import LabelBinarizer

lb_style = LabelBinarizer()
lb_results = lb_style.fit_transform(df2["body_style"])
ret3 = pd.DataFrame(lb_results, columns=lb_style.classes_).head()
print(ret3)

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值