入门数据分析之探索性数据分析

本文详细介绍了数据清洗的过程,包括使用pandas进行数据加载、缺失值检查与处理(dropna和fillna方法)、重复值的检测与删除,以及数据的离散化分箱。通过示例展示了如何计算泰坦尼克号乘客的平均票价、存活人数,以及按性别、舱位和年龄进行统计分析。此外,还提及了数据替换的方法,如使用replace和map函数。
摘要由CSDN通过智能技术生成

1、数据清理与分析

开始之前,导入numpy、pandas包和数据

import numpy as np
import pandas as pd
#加载数据train.csv
df = pd.read_csv('train.csv')
df.head(3)

在这里插入图片描述

数据的清洗简述:
–我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,本章我们将学习缺失值、重复值、字符串和数据转换等操作,将数据清洗成可以分析或建模的样子。

2、 缺失值观察与处理

#方法一
df.info()

在这里插入图片描述

#方法二
print(df.isnull())         # 是缺失值就显示为T
print(df.notnull())        # 不是缺失值就显示为T
print(df.isnull().sum())   # 缺失值的总和

在这里插入图片描述
处理缺失值一:dropna [删除缺失值]

语法:DataFrame.dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)
参数说明:
axis:
axis=0: 删除包含缺失值的行,默认为axis = 0
axis=1: 删除包含缺失值的列

how: 与axis配合使用
how=‘any’ :只要有缺失值出现,就删除该行或列,默认为how=‘any’
how=‘all’: 所有的值都缺失,才删除行或列

thresh: axis中至少有thresh个非缺失值[控制数量不能大于设定数量],否则删除
比如 axis=0,thresh=3:标识如果该行中缺失值的数量大于3,将删除这一行

subset= [’’,’’] 指定哪个字段中有缺失值,删除缺失,默认为None;

在哪些列中查看是否有缺失值
inplace: 是否在原数据上操作。如果为真,返回None否则返回新的copy,去掉了缺失值

df.dropna().head(3)

在这里插入图片描述

处理缺失值二:fillna [填充缺失值]

语法:DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
value: scalar, dict, Series, or DataFrame;dict 可以指定每一行或列用什么值填充
method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None
在列上操作

Method — 填充方式 [ffill / pad: 使用上面的值来填充缺失值];[backfill / bfill :使用下面的值来填充缺失值];[等于EXCEL里面的拖拉数据]
注:如果轴变了,那么左和右就是他的上和下

limit 填充的缺失值个数限制。

inplace=True直接修改原对象。
axis就是轴向

df.fillna(0).head(3)

在这里插入图片描述

3、重复值观察与处理

重复数据常用函数:
DataFrame[‘字段名’].unique() — 以列表的形式显示唯一值;要输入字段名,不然会报错
DataFrame[‘字段名’].value_counts() — 某个字段中,内容重复出现的次数;要输入字段名,不然会报错

df[df.duplicated()]

在这里插入图片描述
对重复值进行处理一:删除重复数据drop_duplicates
语法:DataFrame.drop_duplicates(subset=None, keep=‘first’, inplace=False)
subset — 用来指定特定的列,默认是所有列;
keep — 指定处理重复值的方法,默认是 keep = ‘first’
‘first’ — 保留第一次出现的值;
‘last’ — 保留最后一次出现的值;
False — 删除所有重复值,留下没有出现过重复的; Fasle不用加引号
inplace — 是否在原来数据上修改,还是保留一个副本;默认是在原来数据上修改

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

在这里插入图片描述
最后记得保存:

df.to_csv('test_clear.csv')

4、离散化分箱

#将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'], 5,labels = [1,2,3,4,5])
df.head()

在这里插入图片描述

#将连续变量Age划分为(0,5] (5,15] (15,30] (30,50] (50,80]五个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = [1,2,3,4,5])
df.head(3)

在这里插入图片描述

#将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
df['AgeBand'] = pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
df.head()

在这里插入图片描述

4、数据聚合与运算

我们经常会对数据进行分箱处理的操作, 也就是 把一段连续的值切分成若干段,每一段的值看成一个分类。这个把连续值转换成离散值的过程,我们叫做分箱处理。
比如,把年龄按15岁划分成一组,0-15岁叫做少年,16-30岁叫做青年,31-45岁叫做壮年。在这个过程中,我们把连续的年龄分成了三个类别,“少年”,“青年”和“壮年”就是各个类别的名称,或者叫做标签。

cut和qcut函数的基本介绍
在pandas中,cut和qcut函数都可以进行分箱处理操作。其中cut函数是按照数据的值进行分割,而qcut函数则是根据数据本身的数量来对数据进行分割。

语法:pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
x — 类array对象,且必须为一维,待切割的原形式;
bins — 整数、序列尺度、或间隔索引。如果bins是一个整数,它定义了x宽度范围内的等宽面元数量,但是在这种情况下,x的范围在每个边上被延长1%,以保证包括x的最小值或最大值。如果bin是序列,它定义了允许非均匀bin宽度的bin边缘。在这种情况下没有x的范围的扩展。[就是以什么进行分箱]
right — 布尔值。是否是左开右闭区间;
labels — 用作结果箱的标签也可以给箱子指定需要的名字。必须与结果箱相同长度。如果False,只返回整数指标面元;
retbins — 布尔值。是否返回面元;
precision — 整数。返回面元的小数点几位;
include_lowest — 布尔值。第一个区间的左端点是否包含;
返回值:若labels为False则返回整数填充的Categorical或数组或Series;
若retbins为True还返回用浮点数填充的N维数组;

pandas.qcut(x, q, labels=None, retbins=False, precision=3, duplicates=‘raise’)
x — 类array对象,且必须为一维,待切割的原形式;
q — 整数或分位数组成的数组。 [要分成几个箱子]
labels — 用作结果箱的标签也可以给箱子指定需要的名字。必须与结果箱相同长度。如果False,只返回整数指标面元;
retbins — 布尔值。是否返回面元;
5.precisoon
6.duplicates
结果中超过边界的值将会变成NA

任务:计算泰坦尼克号男性与女性的平均票价

df  = text['Fare'].groupby(text['Sex'])
means = df.mean()
means

在这里插入图片描述
————————————————————————————————————————
任务:统计泰坦尼克号中男女的存活人数

survived_sex = text['Survived'].groupby(text['Sex']).sum()
survived_sex.head()

在这里插入图片描述
————————————————————————————————————————
任务:计算客舱不同等级的存活人数

survived_pclass = text['Survived'].groupby(text['Pclass'])
survived_pclass.sum()

在这里插入图片描述
————————————————————————————————————————
任务:统计在不同等级的票中的不同年龄的船票花费的平均值

text.groupby(['Pclass','Age'])['Fare'].mean().head()

在这里插入图片描述
————————————————————————————————————————
任务:得出不同年龄的总的存活人数,然后找出存活人数的最高的年龄,最后计算存活人数最高的存活率(存活人数/总人数)

#不同年龄的存活人数
survived_age = text['Survived'].groupby(text['Age']).sum()
survived_age.head()

在这里插入图片描述

————————————————————————————————————————

#找出最大值的年龄段
survived_age[survived_age.values==survived_age.max()]

在这里插入图片描述

_sum = text['Survived'].sum()
print(_sum)  # 342
#首先计算总人数
_sum = text['Survived'].sum()

print("sum of person:"+str(_sum))

precetn =survived_age.max()/_sum

print("最大存活率:"+str(precetn))

sum of person:342
最大存活率:0.043859649122807015

5、数据替换

前面我们使用fillna填充缺失值替换属于特殊案例。
pandas中的replace功能和python中的replace差不多;

方法一:python中的replace:
语法:str.replace(oldstr,newstr[,num]) #返回新的数据
oldstr — 需要替换的字符串;
newstr — 新的字符串;
num — 替换次数,默认全部;

str = 'hello,world! hello,china!'
print(str.replace('hello','hi'))
print(str.replace('hello','hi',2))    #替换2次;
print(str.replace('hello','hi',10))  #替换10次,等于替换2次;
print(str)    # str未被修改,replace产生新的数据

方法二:map
不管是利用字典还是函数进行映射,都是把对应的数据逐个当作参数传入到字典或函数中,得到映射后的值;
map是对一列的操作,而replace可以对整个表格操作;

import pandas as pd
path = 'c:/pandas/测试.xlsx'
data = pd.read_excel(path)
data['称呼'] = data['性别'].map({'男':'先生','女':'女士'})  # 新建一列['称呼']
data['性别'] = data['性别'].map({'男':'先生','女':'女士'})  # 直接在性别一列上修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值