DataWhale 动手学数据分析 第二章 数据清洗及特征处理

第二章 数据清洗及特征处理

准备阶段

导入必要的库

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.preprocessing import LabelEncoder

载入数据

数据集下载 https://www.kaggle.com/c/titanic/overview

#加载数据train.csv
df = pd.read_csv('train.csv')

2.1 缺失值观察与处理

我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点,我们需要对这些缺失值进行观察和处理

2.1.1缺失值观察

方法一:

df.info()

输出一:
在这里插入图片描述

由输出可知,‘Age’的非空行数为714,’Cabin‘的非空行数为204,‘Embarked’的非空行数为889

方法二:

df.isnull().sum() # 可以查看每个特征的缺失值个数

输出二:
在这里插入图片描述

方法二则直接输出每个特征的缺失值的总个数

2.1.2缺失值处理

缺失值处理的思路:

  1. 去掉缺失值
  2. 补充缺失值
去掉缺失值
df.dropna()

输出:
在这里插入图片描述

补充缺失值

以下方法将缺失值补充为0

方法一:

df1 =df.fillna({'Age':0})

方法二:

df.loc[df['Age'].isnull(), 'Age'] = 0 # loc函数中,df['Age'].isnull()表示补0的行

两个方法输出一致:
在这里插入图片描述

2.2 重复值的观察与处理

2.2.1 查看数据中的重复值

先建立一个含重复值的DataFrame:

a = pd.DataFrame({'brand':['Yum Yum', 'Yum Yum', 'Indomie', 'Indomie', 'Indomie'],
                  'style':['cup','cup','cup','pack','pack'],
                  'rating':[4, 4, 3.5, 15, 5]})
a

a的二维表格:
在这里插入图片描述

df[df.duplicated()]  # 查看a中重复的值

输出:
在这里插入图片描述

2.2.2 删除重复值

a.drop_duplicates()

输出:
在这里插入图片描述

由输出我们可以看到,原本重复的第1行被删除

2.3 特征观察与处理

我们对特征进行一下观察,可以把特征大概分为两大类:

  • 数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare

    其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征

  • 文本型特征:Name, Sex, Cabin,Embarked, Ticket

    其中Sex, Cabin, Embarked, Ticket为类别型文本特征

2.3.1 对数据进行分箱操作

分箱操作

分箱操作是数据处理中常用的一种技术,用于将连续的数值型数据分割成若干个区间(箱子)。这有助于处理数据中的噪音和异常值,同时也能使模型更易理解和解释,以及更具鲁棒性。

具体操作方法

以下以train.csv文件中连续变量Age为例,进行操作

  • 将Age平均分箱成5个年龄段,并分别用类别变量12345表示

    df['Age bins'] = pd.cut(df['Age'], 5, labels = list('12345'))
    df.head()
    

    输出:
    在这里插入图片描述

    以下以直方图的形式,更直观的表示分箱的结果:

    plt.hist(df['Age'])
    

    输出:
    在这里插入图片描述

  • 将Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示

    df['Age bins'] = pd.cut(df['Age'], [0, 5, 15, 30, 50, 80], right = False, labels = list('12345'))
    
  • 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示

    df['Age bins'] = pd.qcut(df['Age'], [0, 0.1, 0.3, 0.5, 0.7, 0.9], duplicates = 'drop', labels = list('1234'))
    

2.3.2 对文本变量进行转换

以下以train.csv文件中文本变量‘Sex’, ‘Cabin’, ‘Embarked’为例,进行操作

  • 查看文本变量名及种类
df['Sex'].unique()
df['Cabin'].unique()
df['Embarked'].unique()

输出:

array(['male', 'female'], dtype=object)
array([nan, 'C85', 'C123', 'E46', 'G6', 'C103', 'D56', 'A6',
       'C23 C25 C27', 'B78', 'D33', 'B30', 'C52', 'B28', 'C83', 'F33',
       'F G73', 'E31', 'A5', 'D10 D12', 'D26', 'C110', 'B58 B60', 'E101',
       'F E69', 'D47', 'B86', 'F2', 'C2', 'E33', 'B19', 'A7', 'C49', 'F4',
       'A32', 'B4', 'B80', 'A31', 'D36', 'D15', 'C93', 'C78', 'D35',
       'C87', 'B77', 'E67', 'B94', 'C125', 'C99', 'C118', 'D7', 'A19',
       'B49', 'D', 'C22 C26', 'C106', 'C65', 'E36', 'C54',
       'B57 B59 B63 B66', 'C7', 'E34', 'C32', 'B18', 'C124', 'C91', 'E40',
       'T', 'C128', 'D37', 'B35', 'E50', 'C82', 'B96 B98', 'E10', 'E44',
       'A34', 'C104', 'C111', 'C92', 'E38', 'D21', 'E12', 'E63', 'A14',
       'B37', 'C30', 'D20', 'B79', 'E25', 'D46', 'B73', 'C95', 'B38',
       'B39', 'B22', 'C86', 'C70', 'A16', 'C101', 'C68', 'A10', 'E68',
       'B41', 'A20', 'D19', 'D50', 'D9', 'A23', 'B50', 'A26', 'D48',
       'E58', 'C126', 'B71', 'B51 B53 B55', 'D49', 'B5', 'B20', 'F G63',
       'C62 C64', 'E24', 'C90', 'C45', 'E8', 'B101', 'D45', 'C46', 'D30',
       'E121', 'D11', 'E77', 'F38', 'B3', 'D6', 'B82 B84', 'D17', 'A36',
       'B102', 'B69', 'E49', 'C47', 'D28', 'E17', 'A24', 'C50', 'B42',
       'C148'], dtype=object)
array(['S', 'C', 'Q', nan], dtype=object)
  • 将文本变量Sex, Cabin ,Embarked用数值变量12345表示

    df['Sex'].replace(['male', 'female'],[1,2], inplace = True)
    df.head()
    

    输出:
    在这里插入图片描述

    df['Cabin'] = LabelEncoder().fit_transform(df['Cabin']) # 因为Cabin的变量名太多,所以用另一种函数实现
    df.head()
    

    输出:
    在这里插入图片描述

    同理,‘Embarked’的操作也同上

    df['Embarked'] = LabelEncoder().fit_transform(df['Embarked'])
    df.head()
    
  • 将文本变量Sex, Cabin, Embarked用one-hot编码表示

    x = pd.get_dummies(df['Age'], prefix = 'Age')
    df = pd.concat([df, x], axis=1)
    
    for column in ['Cabin', 'Embarked']:
        x = pd.get_dummies(df[column], prefix = column)
        df = pd.concat([df, x], axis = 1)
    

2.3.3 从纯文本特征里提取特征

以下从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)

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

输出:
在这里插入图片描述

2.4 数据的合并

导入所需要的数据

left_up = pd.read_csv('data/train-left-up.csv')
left_down = pd.read_csv('data/train-left-down.csv')
right_up = pd.read_csv('data/train-right-up.csv')
right_down = pd.read_csv('data/train-right-down.csv')

2.4.1 contact方法

result_up = pd.concat([left_up, right_up], axis = 1)  # 将关键字axis设置为1,将数据横向合并
result_down = pd.concat([left_down, right_down], axis = 1)

result = pd.concat([result_up, result_down])          # 默认情况下,将数据纵向合并

2.4.2 join和append方法

# join为横向合并, append为纵向合并
up = left_up.join(right_up)
down = left_down.join(right_down)
result = up.append(down)

2.4.3 merge方法

# merge 需要有共同的行或者列
up = pd.merge(left_up, right_up, left_index = True, right_index = True)
up = pd.merge(left_down, right_down, left_index = True, right_index = True)
result = up.append(down)

2.5 换一种角度看数据

2.5.1 将数据变为Series类型

data.stack()

输出:
在这里插入图片描述

载入数据

df = pd.read_csv('result.csv')

2.6.1 GroupBy机制

list(df.groupby('Sex'))
  • 计算男性与女性的平均票价
mean_fare_sex = df.groupby('Sex')['Age'].mean()
  • 计算男女存活人数

    survived_sex = df.groupby('Sex')['Survived'].sum()
    
  • 计算不同客舱等级的存活人数

    df.groupby('Pclass')['Survived'].sum()
    

2.6.2 agg方法

df.groupby('Pclass')['Survived'].agg('sum')
df.groupby('Sex').agg({'Survived':'sum', 'Fare':'mean'}).rename(columns = {'Survived' : 'survived_sum', 'Fare':'fare_mean'})

2.7 数据可视化

2.7.1 柱状图展示

sex = text.groupby('Sex')['Survived'].sum()
sex.plot.bar()
plt.title('survived_count')
plt.show()

2.7.2 折线图展示

# 排序后绘折线图
fig = plt.figure(figsize=(20, 18))
fare_sur.plot(grid=True)
plt.legend()
plt.show()

2.7.3 展示分布情况

facet = sns.FacetGrid(text, hue="Survived",aspect=3)
facet.map(sns.kdeplot,'Age',shade= True)
facet.set(xlim=(0, text['Age'].max()))
facet.add_legend()
text.Age[text.Pclass == 1].plot(kind='kde')
text.Age[text.Pclass == 2].plot(kind='kde')
text.Age[text.Pclass == 3].plot(kind='kde')
plt.xlabel("age")
plt.legend((1,2,3),loc="best")
  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值