Skip to main content

        数据预处理 - Featured image

数据预处理

数据分析的数据预处理部分

1.数据清洗

1.1 缺失值处理: 识别并填补缺失值,或删除含缺失值的行/列。

删除包含空字段的行

df.dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)

参数说明:

  • axis:默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。

  • how:默认为 ‘any’ 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how=‘all’ 一行(或列)都是 NA 才去掉这整行。

  • thresh:设置需要多少非空值的数据才可以保留下来的。

  • subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。

  • inplace:若设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。

注:用pd.isnull()来判断是否有空值

替换空字符

df.fillna(替换值,inplace=false)

Pandas使用mean()、median() 和 mode() 方法计算列的均值(所有值加起来的平均值)、中位数值(排序后排在中间的数)和众数(出现频率最高的数),常用这三种方法替换空值

注:df.replace(old_value,new_value)将指定值替换为新值

1.2 异常值处理:

识别并替换异常值,或删除异常值的行/列。

异常值分析方法

简单统计量分析:最常用的方法就是分析最大值最小值

3δ准则:正态分布3倍标准差之外为异常,例如标准差2,平均值10,那4-16之间的值为有效值 (读音:三 德尔塔)

df
= df[abs(df-df.mean())> 3*df.std()] #
每个值都判断一次 ,输出一个dataframe表,有True就是有异常值

箱型图分析:箱型图外部为异常

df.plot(kind = “box”)#绘制箱线图

1.3 重复数据处理:检查并删除重复数据,确保每条数据唯一

删除重复数据的行

df.drop_duplicates()

注:用df.duplicates()来判断是否有重复值

1.4 数据格式转换:转换数据类型或进行单位转换,如日期格式转换。

字符串–日期格式转换

pd【列名】.to_datetime()

注:可以利用pd.Timedelta(days=)进行时间的加减

格式转换

pd【列名】.astype()

生成时间序列

date_range()

1.5 文本处理:

对文本数据进行清洗,如去除停用词、词干化、分词等

去除停用词,去除不想要的词,如“the”“is”

自定义函数(基于 nltk 或 spaCy)

提取词干或恢复单次的基本形式

nltk.stem.PorterStemmer()

将文本分割成单词或字词

nltk.word_tokenize()

2.数据集成

2.1 数据排序

根据列的值进行排序

sort_values( by=,ascending=True)

按照指定的列(by)排序,ascending 控制升序或降序,默认为升序

根据行或列的索引进行排序

sort_index( axis=0)

按照行或列的索引排序,axis 控制按行或列排序

2.2 数据聚合

按列分组并聚合

df.groupby(by).agg()

按指定列(by)进行分组,agg() 可以传入不同的聚合函数,进行多种操作

分组groupby()

聚合agg()

多重聚合函数应用

df.groupby(by).agg([func1, func2])

可以对同一列应用多个聚合函数,返回多种聚合结果

透视表

pd.pivot_table(data,values,index, columns, aggfunc)

用指定的列进行行、列分类汇总,values 是需要聚合的值,aggfunc 是聚合函数

交叉表

pd.crosstab()

2.3 数据合并

数据库风格的连接

merge() 方法允许根据某些键值对两个 DataFrame 进行合并,类似SQL 中的 JOIN 操作。支持内连接(两个键值对的交集),外左连接和外右连接

沿轴连接

concat()用于将多个 DataFrame 沿指定轴(行或列)进行连接堆叠,常用于行合并(asix=0)或列合并()

基于索引连接

join() 方法是Pandas 中的简化连接操作,通常用于基于索引将多个 DataFrame 连接

3 数据变换: 把数据变成适合的样式。

3.1 规范化:

最小最大规范化,归一化(Min-Max):将数据缩放到指定的范围(如 [0, 1])。

1、 MinMaxScaler()

2、(df-df.min()/(df.max()-df.min()))

3、from sklearnimport preprocessing

min_max_scaler = preprocessing.minmax_scale(df)

零-均值规范化,标准化(Z-score):将数据转换为均值为0,标准差为1的分布

1、 StandardScaler()

2、(df-df.mean())/df.std()

3、scaler = preprocessing.scale(df)

小数定标规范化:移动小数点位置,落在 [-1,1]之间:

df/10**np.ceil(np.log10(df.abs().max()))

3.2 连续属性离散化: 将连续的数据进行分段,使其变为一段段离散化的区间

分箱(binning):等宽法,等频法

等宽法 pd.cut(x,bins,labels = )

#参数说明

  • x :需要分箱的一维数组或Series

  • bins:分箱的边界。可以是一个整数,表示要分的区间数量,或者是一个序列,表示每个区间的边界。

  • right:布尔值,默认为 True,表示区间是否包含右边界。

  • labels:可选参数,用于指定每个区间的标签。如果提供的标签数量与区间数量不一致,会抛出异常。

  • retbins:布尔值,默认为 False,表示是否返回用于分箱的边界。

  • precision:整数,默认为 3,表示返回区间的精度。

  • include_lowest:布尔值,默认为False,表示是否将最低值包含在第一个区间内。

等频法pd.qcut(x,q,labels = )

参数说明:

  • x:需要分箱的一维数组或 Series。

  • q:分箱的数量,可以是一个整数,或是一个 0 到 1 之间的序列。

  • labels:可选参数,用于指定每个区间的标签。

  • retbins:布尔值,默认为 False,表示是否返回用于分箱的边界。

  • precision:整数,默认为3,表示返回区间的精度。

  • duplicates:字符串,默认为‘raise’,当边界中有重复值时的行为。可以是 ‘raise’(抛出异常)、‘drop’(删除重复的边界)或 ‘ignore’(忽略重复的边界)。

3.3 特征二值化(binarization):

from sklearn.preprocessing import Binarizer

Binarizer (threshold = num).fit_transform(x)

4 数据规约

对属性和数值进行规约获得一个比原数据集小的规约表示,但扔接近原数据的完整性,对规约后数据集挖掘可产生近乎相同的分析结果

4.1 属性规约  :通过减少数据集的维度

方法:向前选择,向后删除,决策树,PCA

PCA(主成分分析法)

form sklearn.decomposition import PCA

pca = PCA(n_components = none) #设定保留的特征数,默认为none,全保留;“mle”会自动选取特征数量;

pca.fit(data)

注:用pca.explained_variance_ratio_  计算每个特征的贡献率(方差百分比)

4.2 数值规约:减少数据集的记录数

有参方法:回归法(线性模型)

无参方法:直方图,聚类,抽样

直方图:用分箱表示数据分布,每个箱子代表一个属性(频率对)

plt.hist(data,bins = )

数据抽样:从数据集中抽取样本,或通过过采样/欠采样处理类别不平衡

随机抽样

df.sample(n = num , replace = False)#不放回抽样,默认为False

df.sample(n= num , replace = True)     #放回抽样

分层抽样

可以先分层,通过添加一列不同数值的随机数据

df ( df[ ]==num ) .sample(frac= num , replace = False)    #不放回抽样,默认为False;frac为0-1的小数,代表抽取百分比

df ( df[ ]== num ) .sample(frac= num , replace = True)     #放回抽样