1.数据清洗的概念和方法总结
2.部分代码练习
其中包含:
2.1识别和处理缺失值
2.2数据标准化
2.3数据归一化
2.4查看数据分布的分箱和指标变量
数据清洗的目的:将数据转化为一种方便分析的格式
首先导入数据
!pip install pandas==0.25.0
import pandas as pd#添加库
df = pd.read_csv("地址", names = headers)#导入数据
df.head()#查看dataframe前5(默认)行
1 识别和处理缺失值
import numpy as np
#一般的缺失值再数据中显示为“?”
df.replace("?", np.nan, inplace = True)# 将 "?" 转换为 NaN
df.head()#再次查看
#用python内置函数识别缺失值,两种方法,.isnull()和.notnull()得到布尔值,判断参数值实际上是否丢了数据。
missing_data = df.isnull()
missing_data.head(5)
#统计缺失值
for column in missing_data.columns.values.tolist():
print(column)
print (missing_data[column].value_counts())
print("")
##输出:
#num-of-doors#我实验中的一个属性
#False 203#203个有值的
#True 2#2个缺失值
#Name: num-of-doors, dtype: int64
#处理缺失值
#两种方法,去掉所在样本或者所在属性(即行或者列)另一个是用一些比较讲究的值对其进行替换
#注意1,只有某个属性大部分都没有值时才建议直接删掉某个属性。
#注意2,替换的时候,可以用均值、最高频数值等进行替换
#计算列平均并替换
avg_1 = df["normalized-losses"].astype("float").mean(axis = 0)
df["normalized-losses"].replace(np.nan, avg_1, inplace = True)#用算来的avg_1替换掉NaN
#使用“.idxmax()”方法自动计算最常见的类型:并用其进行替换
df['num-of-doors'].value_counts().idxmax()
df["num-of-doors"].replace(np.nan, "four", inplace = True)
#注:在以上过程中,都是直接针对某个属性,也就是属性num-of-doors进行操作的
2 数据标准化
数据来源往往五花八门,因此要将数据保存成统一通用格式,方便后续比较。
比如修改某一列的数据单位
在这里是替换燃料的单位
df['city-L/100km'] = 235/df["city-mpg"]
#对要换算的部分直接进行计算,并直接产生一个新的属性列city-L/100m
#用新生成的直接替换掉旧的highway-mpg
df.rename(columns={
'"highway-mpg"':'highway-L/100km'}, inplace=True)
3 数据归一化
目的:将变量的数值变成同一范围内的数,避免因为取值范围的不同,而令模型对属性产生的偏好。
方法:原始值除以取值区间并替换掉原先的一列
# 用(原始值)/(最大值)替换(原始值)
df['length'] = df['length']/df['length'].max()
df['width'] = df['width']/df['width'].max()
4 分箱和指标变量
为了便于分组分析,将连续的值转换成离散的值并观察。
#分箱观察
df["horsepower"]=df["horsepower"].astype(float, copy=True)#将数值转化成float64格式
#此处可以用np.dtype(df["horsepower"])查看是否完成
binwidth = (max(df["horsepower"])-min(df["horsepower"]))/4
#想要四个大小相等的宽度的箱子,取箱子的宽度
bins = np.arange(min(df["horsepower"]), max(df["horsepower"]), binwidth)#分箱子
#用cut函数为每个范围进行命名并将所有的值转换成高中低三种值
group_names = ['Low', 'Medium', 'High']
df['horsepower-binned'] = pd.cut(df['horsepower'], bins, labels=group_names,include_lowest=True )
#对分箱进行可视化
#引入画图的库
!pip install matplotlib
%matplotlib inline
import matplotlib as plt
from matplotlib import pyplot
#
a = (0,1,2)
# 绘制"horsepower"的直方图,设置参数bins = 3
plt.pyplot.hist(df["horsepower"], bins = 3)
# 设置x/y标签并绘图标题
plt.pyplot.xlabel("horsepower")
plt.pyplot.ylabel("count")
plt.pyplot.title("horsepower bins")
#输出如下
#指标变量:如果某一个特征只有两个值,比如西瓜皮的颜色是青绿或者乌黑,可以用01分别表示这两个值。因为电脑不知道青绿和乌黑的意义。
#注意:指标变量本身没有意义。
# 获取特征fuel-type的指示器变量并将其分配给数据框“dummy_variable_1”。
dummy_variable_1 = pd.get_dummies(df["fuel-type"])
# 为了清晰起见,更改列名
dummy_variable_1.rename(columns={
'fuel-type-diesel':'gas', 'fuel-type-diesel':'diesel'},
# 合并数据框“df”和“dummy_variable_1”
df = pd.concat([df, dummy_variable_1], axis=1)
# 从“df”中删除原始列"fuel-type"
df.drop("fuel-type", axis = 1, inplace=True)