动手学数据分析第二章学习笔记

本文介绍了如何通过isnull()和pd.isna()检查数据集中的缺失值,探讨了删除和填充缺失值的方法,包括dropna()和fillna(),以及针对重复值的duplicated()和drop_duplicates()操作。此外,还重点讲解了特征转换,如离散化、数值化和OneHot编码技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一节 数据清洗及特征处理

查看数据集中缺失值

用isnull()或者isna(),或者用info()可以查看数据集中非空数据个数
这里有一些坑:

  1. numpy中的np.nan是float格式,并且不能判断两个np.nan数相等
  2. None是NoneType,np.nan is None的结果也会是False
  3. numpy模块的isnan方法仅支持对数值进行判断,因此传入的如果是字符串类型会报错
  4. 如果我们的空值只会出现由numpy模块的nan,或只想判断由numpy模块生成的nan值,可以使用,但其他场合一律不建议使用(例如math模块也会产生math.nan)
  5. pd.isna()和pd.isnull()用法相同,没什么区别,对DataFrame中会有np.nan、字符串和None类型时都适用,推荐使用这种方式,不容易报错。

数据集中缺失值的处理

  • 忽略缺失值,但是会造成数据集数量减少,如果数据集本身数量不多就会对分析结果造成较大影响。dropna()有how参数是常用参数,how='all’时,一行数据全为NA时才会被删除,默认丢弃任何含有缺失值的行,要删除列时增加参数axis=1即可。
train['Age'].dropna()

也可设置参数thresh=n,表示保留至少有n个非NA数的行

  • 填充缺失值,fillna(),
    method={‘ffill’/‘pad’,‘bfill’/‘backfill’,None},ffill表示用前面一个非空值填充缺失值,bfill指用后面一个非空值填充缺失值,默认参数为None,表示用一个数填充缺失值;
    inplace参数表示是否替换原数据集;
    limit参数限制填充个数
    axis参数限制填充方向,默认axis=0按列填充,axis=1按行填充
train['Age']
train['Age'].fillna(method='ffill',limit=100)

除了这些简单的填充缺失值的方式,也可用平均值、众数、中位数来填充,还可以观察数据之间的规律,利用规律填充,例如建立要填充的特征和其他相关特征之间的回归模型,将已知数据作为训练集,要填充数据作为测试集,当然也不是越复杂的方法就越好,面对具体问题要分析数据特点和业务特点确定实施方案

数据集中重复值的处理

  • 查看重复值:利用duplicated()方法
    duplicated()方法有两个参数:subset参数,可以指定数据子集;keep=‘first’/‘last’,即遇到重复数据保留哪一个,被保留的数据标记为False,被删除的数据标记为True,first表示保留第一个,last表示保留最后一个,keep=False则所有重复数据都删除
  • 删除重复值:drop_duplicated()方法,参数和duplicated()方法类似,多了一个inplace参数,默认inplace=False,不修改数据集,生成一个删除重复数据之后的新数据集,inplace=True会修改当前数据集

数据获取来之不易,不要轻易删除数据!

特征观察与处理

为了建模计算便利,需要把非数值型特征转换成数值型特征,把连续性数值特征转换成离散型数值特征。
离散化连续特征:分箱操作
一种无监督离散化方法,分为两类,1 等距离分箱 2 等频度分箱
等距离分箱:

pd.cut(train['Age'],5,labels=[1,2,3,4,5])

返回的是一个特殊的Categorical对象

#还可传入自定边界分箱
bins=[0,5,15,30,50,80]
pd.cut(train['Age'],bins,labels=[1,2,3,4,5])

等频度分箱:

pd.qcut(data, 4) 
#也可传入自定义分位点
q=pd.qcut(train['Age'],[0,0.1,0.3,0.5,0.7,0.9,1.0],labels=[1,2,3,4,5,6])

特征数值化:

  1. relpace方法:
train['Sex'].replace({'male':1,'female':2})
#也可传入对应数组
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
  1. scikit-learn中LabelEncoder类
from sklearn.preprocessing import LabelEncoder
le=LabelEncoder()
for i in ['Cabin','Embarked']:
    label_dict = dict(zip(train[i].unique(), range(train[i].nunique())))
    #用map将不同类型用字典映射到连续型数值float
    train[ i+"_labelEncode"] = train['Cabin'].map(label_dict)
    #传入参数只能为数值型或字符串型
    train[ i+"_labelEncode"] = le.fit_transform(train[i].astype(str))
    #转化成离散型指标(int32) 

OneHot编码
One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。

  1. OneHot类:
#onehotencoder
from sklearn.preprocessing import OneHotEncoder
train1=train.dropna()
ohe=OneHotEncoder()
features=ohe.fit_transform(train1[['Cabin']])
features.toarray()[:,1:].shape[1]

这里取第一列之后的数是因为实际上onehot编码中第一列是冗余的,三个不同类型值只需要两位编码即可表示。

  1. get_dummies()方法
pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False)[source]

prefix=加前缀,drop_first表示删除第一列冗余列,其他参数不常用


#     x = pd.get_dummies(df["Age"] // 6) #//表示向下取整
#     x = pd.get_dummies(pd.cut(df['Age'],5))
    x = pd.get_dummies(df['Embarked'], prefix='Embarked')
    df = pd.concat([df, x], axis=1)
    #或者df=df.join(x)
    df['Embarked'] = pd.get_dummies(df['Embarked'], prefix='Embarked')
    
df.head()

提取字符特征
这一部分我参考了csdn上一博主的总结,写的较为详细,正则表达式的用法学过很多次,当下会了过一段时间再用又会忘,我果断选择用的时候再参考,多学几次就会了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值