第二章数据清洗及特征处理
缺失值观察与处理
-
查看缺失值个数
df.isnull().sum() #返回一维数据,检查每列数据为空的个数 df.info() #返回一维数据,检查每列数据不为空的个数
-
对缺失值进行处理
df.loc[df['列名'].isnull(),'列名']=0 #轴标签索引,而不是从0 →N-1的下标
df.fillna({'列名':0}) #对该列空值数据赋0,生成副本,不改变原文件
df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False) 参数说明: axis:axis=0: 删除包含缺失值的行axis=1: 删除包含缺失值的列 how: 与axis配合使用 how=‘any’ :只要有缺失值出现,就删除该行货列 how=‘all’: 所有的值都缺失,才删除行或列 thresh:axis中至少有thresh个非缺失值,否则删除 比如 axis=0,thresh=10:标识如果该行中非缺失值的数量小于10,将删除改行 subset: list 在哪些列中查看是否有缺失值 inplace: 是否在原数据上操作。如果为真,返回None否则返回新的copy,去掉了缺失值。`
重复值观察与处理
-
查看重复值
df.duplicated() #返回一维数据,返回每一列是否有重复值,有为True,没有为False df[df.duplicated()] #返回二维数据(表)
-
删除重复值
df.drop_duplicates() #删除重复值,第一行和第二行重复,第二行为重复数据,删除第二行
数据特征观察与处理
-
数据特征分为两类:数值型特征和文本型特征,数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。
-
对数据进行分箱(离散化)处理
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', ordered=True) 参数说明 x:分箱时输入的数组,必须为一位数组 bins:分类依据的标准,可以是int、标量序列或间隔索引(IntervalIndex) right:是否包含bins区间的最右边,默认为True,最右边为闭区间,False则不包含 labels:要返回的标签,和bins的区间对应 retbins:是否返回bins,当bins作为标量时使用非常有用,默认为False precision:精度,int类型 include_lowest:第一个区间是否为左包含(左边为闭区间),默认为False,表示不包含,True则包含 duplicates:可选,默认为{default 'raise', 'drop'},如果 bin 边缘不是唯一的,则引发 ValueError 或删除非唯一的。 ordered:默认为True,表示标签是否有序。如果为 True,则将对生成的分类进行排序。如果为 False, 则生成的分类将序的(必须提供标签)
ex: 1. 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示 df['Age bins']=pd.cut(df['Age'],5,labels=list('12345')) 2. 将连续变量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对每一段命名,默认为[0,5) [5,15) [15,30) [30,50) [50,80) df['Age bins']=pd.cut(df['Age'],[0,5,15,30,50,80],right=False,labels=list('12345')) #命名后 3.将连续变量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('12345'))
对文本变量进行操作
-
查看文本变量名及种类
df['列名'].unique() #显示列名的数据的种类,例如sex列的种类为male和female
-
将文本变量用数值变量12345表示
df['列名'].replace(['待替换文本1','待替换文本2',...],[1,2,...],inplace=True) #适用于该列种类少的,易于替换
from sklearn.preprocessing import LabelEncoder #导入LabelEncoder,利用fit_transform函数 df['列名']=LabelEncoder().fit_transform(df['列名']) #系统自动用合适数值替换,适用于类别多的列,替换列原有数据
-
将文本变量用one-hot编码表示
- one-hot编码:形成一个01表,符合该列数值为1,不符为0
x=pd.get_dummies(df[列名],prefix=列名) #将该列文本种类生成一个表 df=pd.concat([df,x],axis=1) #将生成的表接在原表后面
-
从纯文本Name特征里提取Titles的特征(所谓Titles就是Mr,Miss,Mrs等)
df['Title']=df.Name.str.extract('([A-Za-z]+)\.') #提取符号 . 之前的文本
数据重构
合并数据
-
concat方法(将数据根据不同的轴作简单的融合,可合并行和列)
-
pd.concat( [df数据1, df数据2, …… ], axis = 0或1, join = 连接方式, keys = 表明数据来源 ) ex: result_up=pd.concat([left_up,right_up],axis=1) result_down=pd.concat([left_down,right_down],axis=1) result=pd.concat([result_up,result_down])
-
参数说明:
objs: series,dataframe或者是panel构成的序列lsit
axis: 需要合并链接的轴,0是行,1是列,默认为0
join:连接的方式 inner,或者outer
-
-
join方法(只能合并列,把列横向合并)
-
join(other,on=None,how=“left”,lsuffix=" “,rsuffix=” ",sort=False) ex: up=left_up.join(right_up)
-
参数说明:
on:用于连接名。 //如果两个表中行索引和列索引重叠,那么当使用join()方法进行合并 时,使用参数on指定重叠的列名即可
how:可以从{“left”,“right”," outer",“inner”} 中任选一个,默认使用left的方式。
lsuffix:接收字符串,用于在左侧重叠的列名后添加后缀名。
rsuffix:接收字符串,用于在右侧重叠的列名后添加后缀名。
sort:接收布尔值,根据连接键对合并的数据进行排序,默认为False。
join()方法默认使用的左连接方式,即以左表为基准,join()方法进行合并后用左表索引为合并后的表的索引关于how:https://blog.csdn.net/MsSpark/article/details/83098468?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165320961516782390557692%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165320961516782390557692&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-83098468-null-null.142
-
-
append方法(把行纵向合并,返回一个新对象)
-
append(other, ignore_index=False, verify_integrity=False,sort=None) ex: result=up.append(down)
-
参数说明:
other:DataFrame、series、dict、list这样的数据结构
ignore_index:默认值为False,如果为True则不使用index标签
verify_integrity :默认值为False,如果为True当创建相同的index时会抛出ValueError的异常
sort:boolean,默认是None,该属性在pandas的0.23.0的版本才存在
-
-
merge方法:
-
merge(DataFrame2, how=‘inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(’_x’, ‘_y’)) ex: up=pd.merge(left_up,right_up,left_index=True,right_index=True)#后两个参数表示用行索引来拼接(合并列),默认为列索引
-
参数说明
-
stack方法
-
stack会把数据的列变成行
-
data_unit=data.stack()
数据聚合与运算
数据运用
https://zhuanlan.zhihu.com/p/101284491
-
groupby机制
-
df.groupby('列名') #对df按照性别分组,不返回结果 list(df.groupby('列名'))[0] ##对df按照性别分组,返回结果(list),[0]表示显示前面的索引,本题前面是female
-
ex: df.groupby('Sex')['Fare'].describe() #以性别分组,不同性别的船费情况船费 a=df.groupby(['Pclass','Age'])['Fare'].mean() # 查看不同仓位等级不同年龄的票价情况的均值
-
-
agg聚合操作
-
groupby后非常常见的操作
-
min--最小值 max--最大值 sum--求和 mean--均值 median--中位数 std--标准差 var--方差 count--计数
-
ex: df.groupby('Sex').agg({'Survived':'sum','Fare':'mean'}).rename(columns={'Survived':'Survived_sum','Fare':'Fare_mean'}) #agg里面对survived和fare列分别进行了求和及求均值的操作,rename是对两列重新命名
-
格式化输出
-
'最大存活率:{}'.format(rate) # 输出:最大存活率:0.432,,rate=0.432
数据可视化
-
常见的可视化图案
- 柱形图:根据柱形的高低来描绘数据的基本变量,为了图像的视觉接受程度,通常一组数据不超过十个。
- 折线图:使用线条的形式反映数据随时间的变化趋势,数据越多时,反映的趋势过程越准确,折线图通常处理的数据以时间变化为主要依据点。
- 饼图:展现形式与圆饼相似,将数据按照百分比的形式进行展示对比。人的肉眼对于百分比的精确度掌握不足,在选择数据时,以不超过六个为佳。
- 散点图:三维数据的应用图,对于数据的划分也是依据多个不同的指标进行,散点图中单个数据的作用不明显,数据量越大,散点图的作用越明显,将数据集中的区域作为数据的分类标准。
- 雷达图:它通常作用于四维数据(不常见),按照多属性的划分标准进行区分。它所应用的数据量也不宜太多,否则容易从视觉的角度变得混乱。
-
利用循环作图
#unique_pclass为已排好序的舱位等级(123) for i in unique_pclass: df.Age[df.Pclass==i].plot() #制作一个不同年龄的舱位等级的折线图 #循环结束 plt.legend(unique_pclass)
-
matplotlib作图
-
#条件 import matplotlib.pyplot as plt #导入包 对象为DataFrame sex=df.groupby('Sex')['Survived'].sum()
-
柱状图:
df.plot.bar() #柱状图 plt.title('xxx') #给图命名 df.plot(kind='bar',stacked='True') # stacked参数将柱形图堆叠,方便观察 plt.xlabel('xxx') #给x轴取名 plt.ylabel('xxx') #给y轴取名
-
折线图
fare.plot() #折线图 plt.title('xxx') #给图命名 df.plot.density() #绘制折线图,且纵轴用密度表示 plt.legend((0,1)) #给曲线赋0,1,方便观察 plt.xlabel('xxx') #给x轴取名 plt.ylabel('xxx') #给y轴取名
-
直方图
df.hist(bins=5,alpha=0.5,density=1) # bins是平均分段个数,alpha是直方图的透明度,density=1是指按密度显示值(y轴) plt.title('xxx') #给图命名 plt.legend((0,1)) #给方块赋0,1,方便观察 plt.xlabel('xxx') #给x轴取名 plt.ylabel('xxx') #给y轴取名
-
-
unstack(将列的数据堆叠成行,从一维数据变成二维数据)
https://blog.csdn.net/fullbug/article/details/122916628?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165331077116782391832752%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165331077116782391832752&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-122916628-null-null.142
-
seaborn作图
import seaborn as sns #导入 sns.kdeplot(df.Age[df.Pclass==1],shade=True,linewidth=0) #作图 # shade=True,填充满折线图和x轴间的空间 #linewidth=0,折线的宽度