动手学数据分析Task02

数据清洗

首先还是导入numpy、pandas包和数据

import numpy as np
import pandas as pd

任务一:缺失值观察

然后先查找缺失值

查找存在缺失值的列

df.isnull().any()

查找均为缺失值的列

df.isnull().all()

查找存在缺失值的行

nan_lines = df.isnull().any(1)

统计有多少行存在缺失值

nan_lines.sum()

【这些是查找资料是学到的】
题目:查看每个特征缺失值个数

df.isnull().sum()

【结果】
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64

题目:查看Age, Cabin, Embarked列的数据

df[['Age','Cabin','Embarked']].head(3)

另外:查看有缺失值的行信息

df[nan_lines]

任务二:对缺失值进行处理

处理缺失值的思路:人为原因是由于人的主观失误、历史局限或有意隐瞒造成的数据缺失。对于这种人为因素缺失值的处理,从总体上来说分为删除缺失值和缺失值插补。

dropna()函数主要用于滤除缺失数据,即删除缺失值。
参数有以下五种:
axis:{0 or ‘index’, 1 or ‘columns’}, 默认0
how:{‘any’, ‘all’}, 默认any
thresh:int, optional
subset:array-like, optional
inplace:bool, 默认False

丢弃至少缺少一个元素的行。

df.dropna()

fillna()函数主要是使用指定方法填充 NA/NaN 值,即填充缺失值。
参数有以下六种:
value:scalar, dict, Series, or DataFrame,此值不能是列表。
method:{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, 默认None
axis:{0 or ‘index’, 1 or ‘columns’}
inplace:bool, 默认False
limit:int, 默认None
downcast:dict, 默认是 None

将所有NaN元素替换为0s。

df.fillna(0)

检索空缺值

思考:检索空缺值用np.nan,None以及.isnull()哪个更好,这是为什么?如果其中某个方式无法找到缺失值,原因又是为什么?

Pandas 主要用 np.nan 表示缺失数据。 计算时,默认不包含空值。

数值列读取数据后,空缺值的数据类型为float64所以用None一般索引不到。

任务三:重复值观察与处理

pandas提供了两个方法专门用来处理数据中的重复值,分别为**duplicated()drop_duplicates()**方法。其中,前者用于标记是否有重复值,后者用于删除重复值,它们的判断标准是一样的,即只要两条数据中所有条目的值完全相等,就判断为重复值。

df[df.duplicated()]

任务四:对重复值进行处理

在任务三中,有提到可以用**drop_duplicates()**方法来删除重复值。

df = df.drop_duplicates()
df.head()

任务五:将前面清洗的数据保存为csv格式

可以使用pandas.Dataframe.to_csv()函数来储存数据为csv文件。

df.to_csv('test_clear.csv')

特征值观察与处理

任务一:对年龄进行分箱(离散化)处理

1 分箱操作是什么?
分箱操作就是将连续数据转换为分类对应物的过程。
比如将连续的身数高据划分为:矮中高。
分箱操作分为等距分箱和等频分箱。
分箱操作也叫面元划分或者离散化。

2 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示(即等宽分箱)

df['AgeGroup'] = pd.cut(df.['Age'],#分箱数据
                        bins = 5,#宽度
                        labels=['1','2','3','4','5']#分箱分类)

df.to_csv('test_ave.csv')#保存

3 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示(指定宽度分箱)

这里需要提一下:right:bool, 默认True
right:指示bins是否包含最右边缘。如果True(默认值),则bins表示(1,2]、(2,3]、(3,4)。

df['AgeGroup'] = pd.cut(df.['Age'],#分箱数据
                        bins = [0,5,15,30,50,80],#分箱断点
                        right = False,# 左闭右开
                        labels=['1','2','3','4','5'])# 分箱后分类

df.to_csv('test_cut.csv')#保存

4 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示(即等频定频分箱)

df['AgeGroup'] = pd.qcut(df.['Age'],
                         q = [00.10.30.50.70.9],# 按比例分箱
                         labels=['1','2','3','4','5']) # 分箱后分类

df.to_csv('test_pr.csv')#保存

以上参考:python pandas 分箱操作

任务二:对文本变量进行转换

(因查找的资料过少,不能完全理解,就先按照答案再找函数)
(1) 查看文本变量名及种类

#方法一: value_counts
df['Sex'].value_counts()
df['Cabin'].value_counts()
df['Embarked'].value_counts()

方法一:value_counts()是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值。
value_counts()是Series拥有的方法,一般在DataFrame中使用时,需要指定对哪一列或行使用

作者:tommyjex
链接:https://www.jianshu.com/p/f773b4b82c66
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

#方法二: unique
df['Sex'].unique()
#array(['male', 'female', 0], dtype=object)
df['Sex'].nunique()
#3

方法二:unique
Pandas中Series和DataFrame的两种数据类型中都有nunique()和unique()方法。这两个方法作用很简单,都是求Series或Pandas中的不同值。而unique()方法返回的是去重之后的不同值,而nunique()方法则直接放回不同值的个数。
参考:Pandas中的unique()和nunique()方法

(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示

replace是一组一组替换

#方法一: replace
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
df.head()

map是一对一的替换

#方法二: map
df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2})
df.head()

sklearn.preprocessing.LabelEncoder():标准化标签,将标签值统一转换成range(标签值个数-1)范围内
先要获取标签值,再将标签值转化,最后将将标准化的标签值反转。

#方法三: 使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
    lbl = LabelEncoder()  
    label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
    df[feat + "_labelEncode"] = df[feat].map(label_dict)
    df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))

df.head()

(3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示
独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。
可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征(如成绩这个特征有好,中,差变成one-hot就是100, 010, 001)。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。

这样做的好处主要有:
1)解决了分类器不好处理属性数据的问题
2)在一定程度上也起到了扩充特征的作用

#方法一: OneHotEncoder
for feat in ["Age", "Embarked"]:
#     x = pd.get_dummies(df["Age"] // 6)
#     x = pd.get_dummies(pd.cut(df['Age'],5))
    x = pd.get_dummies(df[feat], prefix=feat)
    df = pd.concat([df, x], axis=1)
    #df[feat] = pd.get_dummies(df[feat], prefix=feat)
    
df.head()

任务三(附加):从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)

df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
df.head()

df.to_csv('test_fin.csv')#保存

extract/extractall:接受正则表达式,抽取匹配的字符串(一定要加上括号)
extract搭配expand参数

参考:详解 16 个 Pandas 函数,让你的 “数据清洗” 能力提高 100 倍!

总结

第二章的第一节学习了不少梳理数据,以及各种归类数据的方法,最后两种处理特征还是有些不太理解,会再多找一些资料看看的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值