数据分析基础之《pandas(6)—高级处理》
一、缺失值处理
1、如何处理nan
两种思路:
(1)如果样本量很大,可以删除含有缺失值的样本
(2)如果要珍惜每一个样本,可以替换/插补(计算平均值或中位数)
2、判断数据是否为nan
(1)pd.isnull(df)
返回一堆布尔值,False不是缺失值,True是缺失值
(2)pd.notnull(df)
返回一堆布尔值,True不是缺失值,False是缺失值
3、缺失值处理方式
存在缺失值nan,并且是np.nan
(1)dropna(axis='rows', inplace=False)
删除存在缺失值
默认不替换原数据,返回新数据,inplace=True修改原数据
(2)fillna(value, inplace=True)
替换缺失值
说明:
value:替换成的值
inplace:
True:会修改原数据
False:不替换修改原数据,生成新的对象
(3)缺失值不是nan,是其他标记的
后面再说
二、缺失值处理实例
1、电影数据文件获取
import pandas as pd
movie = pd.read_csv("./IMDB-Movie-Data.csv")
movie
import numpy as np
# 判断是否存在缺失值
np.any(pd.isnull(movie))
np.all(pd.notnull(movie))
# 用dataframe的any方法
pd.isnull(movie).any() # 返回每一个字段是否有缺失值
# 用dataframe的all方法
pd.notnull(movie).all()
# 用dataframe的isnull方法
movie.isnull().sum()
2、删除含有缺失值的样本
# 缺失值处理
# 删除含有缺失值的样本
data1 = movie.dropna()
data1.isnull().sum()
3、替换缺失值
# 含有缺失值的字段
# Revenue (Millions)
# Metascore
movie["Revenue (Millions)"].fillna(movie["Revenue (Millions)"].mean(), inplace=True)
movie["Metascore"].fillna(movie["Metascore"].mean(), inplace=True)
movie.isnull().sum()
4、不是缺失值nan,是其他标记的
比如是?
思路:
(1)进行替换,将?替换成np.nan
(2)处理np.nan缺失值的步骤来
(3)replace(to_replace=, value=)
说明:
to_replace:替换前的值
value:替换后的值
# 不是缺失值nan,是其他标记的
name = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',
'Normal Nucleoli', 'Mitoses', 'Class']
data = pd.read_csv("./breast-cancer-wisconsin.data", names=name)
data
data_new = data.replace(to_replace="?", value=np.nan)
data_new
data_new.dropna(inplace=True)
data_new.isnull().sum()
三、数据离散化
1、什么是数据离散化
我们用数值表示类别,计算机它只知道数值,会认为数值大的有什么优势
连续属性的离散化就是将连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数、值代表落在每个子区间中的属性值,避免了由于数值差异导致类别的平衡
例子1:
男 女 年龄
A 1 0 23
B 0 1 30
C 1 0 18
例子2:
原始的升高数据:165、174、160、180、159、163、192、184、
假设按照身高分几个区间段:(150,165],(166,180],(180,195]
这样我们将数据分到了三个区间段,我们可以对应的标记为矮、中、高三个类别,最终要处理成一个“哑变量”矩阵
我们把这种数据编码称为one-hot编码,也叫哑变量
2、为什么要数据离散化
连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数,离散化方法经常作为数据挖掘的工具
3、如何实现数据离散化
流程:
(1)对数据进行分组
(2)对分好组的数据求哑变量
4、对数据分组方法
pd.qcut(data, bins)
自动分组
说明:
data:要分组的数据
bins:要分的组数
返回值:分好组的Series
pd.cut(data, bins)
自定义分组
说明:
data:要分组的数据
bins:自定义的区间,以列表的形式[]传进来
返回值:分好组的Series
series.value_counts()
统计分组次数
对数据进行分组一般会与value_counts搭配使用,统计每组的个数
5、对分好组的数据求哑变量(one-hot编码)
pd.get_dummies(data, prefix=None)
说明:
data:array-like、Series、DataFrame
prefix:分组名字
6、小案例
# 数据的离散化
# 准备数据
data = pd.Series([165,174,160,180,159,163,192,184], index=['No1:165', 'No2:174','No3:160', 'No4:180', 'No5:159', 'No6:163', 'No7:192', 'No8:184'])
data
# 自动分组
sr = pd.qcut(data, 3)
sr
# 转换成one-hot编码
pd.get_dummies(sr, prefix="height")
# 统计每个区间有多少样本
sr.value_counts()
# 自定义分组
bins = [150, 165, 180, 195]
cut = pd.cut(data, bins)
cut
pd.get_dummies(cut, prefix="身高")
cut.value_counts()
7、one-hot编码占内存,然后再用稀疏矩阵来减少内存。达到提取特征的目的
8、案例:股票的涨跌幅离散化
# 股票涨跌幅离散化
# 1、读取股票的数据
stock = pd.read_csv("./stock_day.csv")
p_change = stock["p_change"]
p_change
# 自动分组
sr = pd.qcut(p_change, 10)
sr.value_counts()
# 离散化
pd.get_dummies(sr, prefix="涨跌幅")
# 自定义分组
bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100]
sr = pd.cut(p_change, bins)
sr.value_counts()
# 离散化
stock_change = pd.get_dummies(sr, prefix="rise")
stock_change