Pandas之数据清洗

  • 一、查看数据基本信息

一般拿到数据,我们第一步需要做的是了解数据的整体情况,例如以下数据:

  • 1、df.info()

  • 2、df.head() 和 df.tail()

查看头部的 n 条数据可以使用 head 方法,查看尾部的 n 条数据可以使用 tail 方法

 

  • 3、df.shape

通过 .shape 获取数据的形状

  • 4、df.T 或 df.transpose()

通过 .T 获取数据的转置

  • 5、df.values

通过 DataFrame 来获取它包含的原有数据,可以通过 .values 来获取,获取后的数据类型是一个 ndarray

 

  • 二、描述与统计

  • 1、常用描述性统计指标

获取到数据之后,想要查看下数据的简单统计指标(最大值、最小值、平均值、中位数等),DataFrame中有两种方法可以实现:

  • 方法一:直接通过DataFrame抽取出来的单列series使用series的相应统计方法或函数

  • 方法二:通过使用numpy对应的方法或函数,处理目标也是DataFrame抽出来的series

DataFrame 和 Series 均支持以下方法:

通过调用 min、mean、quantile、sum 方法可以实现最小值、平均值、中位数以及求和,可以看到,对一个 Series 调用 这几个方法之后,返回的都只是一个聚合结果

  • 2、df.describe()

调用 .describe() 方法后,会显示出数字类型的列的一些统计指标,如 总数、平均数、标准差、最小值、最大值、25%/50%/75% 分位数:

如果想要查看非数字类型的列的统计指标,可以设置 include = ["object"] 来获得:

也可以数字和非数字类型的数据都展示:

  • 3、Series.value_counts()

 统计某个字段不同数值出现的频次,可以使用 .value_counts() 方法

快速查看各列数据的分布,可以使用循环:

for i in user_infor.columns:
    print(user_infor[i].value_counts(),"\n")
  • 三、数据离散化

  • 1、pd.cut()

想要将数据进行离散化(分箱),就是将数据分成几个区间,例如想要将年龄分成 3 个区间段,就可以使用 pd.cut() 方法来完成,返回的也是 Series

cut 默认自动生成等距的离散区间:

自定义区间:

离散化之后,想要给每个区间起个名字,可以在 pd.cut() 中使用参数 labels 来指定:

  • 2、pd.qcut()

 cut 是根据每个值的大小来进行离散化,qcut 是根据每个值出现的次数来进行离散化,也就是基于分位数的离散化功能

  • 3、np.percentile():计算分位数

  • 四、排序功能

Pandas 支持两种排序方式:按轴(索引或列)排序 和 按实际值排序

  • 1、df.sort_index()

sort_index() 方法默认是按照索引进行升序排的

如果想要进行降序排,可以设置 ascending=False ,对列名进行排序,可以设置 axis=1

  • 2、df.sort_values()

实现按照实际值来排序,需要使用 sort_values() 方法

有时候可能需要按照多个值来排序,例如:按照年龄和城市来一起排序,可以设置参数 by 为一个 list 即可

注意:list 中每个元素的顺序会影响排序优先级

  • 3、series.nlargest()

一般在排序后,可能需要获取最大的n个值或最小值的n个值,使用 nlargest() 和 nsmallest() 方法来完成,比先排序再使用 head() 方法快得多

  • 五、函数应用及映射方法

虽说 Pandas 为我们提供了非常丰富的函数,有时候可能需要自己使用高级函数来实现自定义功能,并将它应用到 DataFrame 或 Series中,常用到的函数有:

  • 1、Series.map()

map 是 Series 中特有的方法,通过它可以对 Series 中的每个元素实现转换

  • (1)通过字典进行映射转换

  • (2)通过自定义函数来进行映射转换

  • 2、Series.apply() 和 df.apply()

apply 方法既支持 Series,也支持 DataFrame,在对 Series 操作时会作用到每个值上,在对 DataFrame 操作时会作用到所有行或所有列(通过 axis 参数控制)

  • (1)对 Series 来说,如果使用自定义函数映射的方法,apply 方法 与 map 方法区别不大,但是 apply 不能支持对字典的映射转换

  • (2)对 DataFrame 来说,apply 方法的作用对象是每一行或每一列数据(整个 Series)

  • axis为 0或 columns:将函数应用于每列

  • axis为 1或 index:将函数应用于每行

  • 3、df.applymap()

applymap 方法针对于 DataFrame,它作用于 DataFrame 中的每个元素,它对 DataFrame 的效果类似于 apply 对 Series 的效果 

总结:pandas 中 map()、apply()、applymap() 的区别

  • map() 方法适用于 Series 对象,可以通过字典或函数类对象来构建映射关系对 Series 对象进行转换

  • apply() 方法适用于 Series 对象、DataFrame对象、Groupby对象,处理的是行或列数据(本质上处理的是单个 Series ),用函数类对象来构建映射关系对 Series 对象进行转换

  • applymap() 方法用来处理 DataFrame 对象里的单个元素值,也是使用函数类对象映射转换

  • 六、缺失值的处理

  • 1、什么是缺失值

在了解缺失值如何处理之前,首先要知道的就是什么是缺失值?直观上理解,缺失值表示的是"缺失的数据"

造成的缺失值有很多原因,实际生活中可能由于有的数据不全所以导致数据缺失,也有可能由于误操作导致数据缺失,又或者人为地造成数据缺失

在 DataFrame 中被当作是缺失值来处理的有:

  • Python 对象中的 None

  • numpy 中的 np.nan,显示标签是 "NaN","NaN" 是特殊的浮点数

其实如果 DataFrame 中存在 Python 中的 None 对象,一旦转化为 dtype 类型数据(object类型除外),None 对象都会转换成 np.nan

  • 2、发现缺失值

  • (1)df.isnull()

判断是否为空值

快速统计每个字段缺失值的数量:

一般是对单列变量的缺失值进行观察,并利用返回的布尔型 Series 对 DataFrame 进行筛选:

  • (2)df.notnull()

判断是否不为空值

  • 3、df.dropna() 剔除缺失值

直接对DataFrame对象使用 .dropna() 方法会删除掉所有带有缺失值的行(返回新表,并不是改变原表):

如果里面增加axis参数,指定第二坐标轴,就会默认删掉出现缺失值的列:

df.dropna() 中的参数 how 和 thresh 是设置删除行列标准的参数:

  • 参数how

how = "all":只有当该列(或行)全都为缺失值时,才会将该列(或行)删除
how = "any":只有当该列(或行)有一个缺失值时,就会将该列(或行)删除

  • 参数thresh

thresh参数设置的是:至少留下包含多少个非缺失值的列(或行)

示例:

4、df.fillna() 填充缺失值

填充缺失值的思路:

  • 根据业务知识填充

  • 连续性变量缺失值的填充:均值、中位数

  • 分类型变量缺失值的填充:众数

  • 预测值填充

固定值填充:

填充均值容易受到异常值的影响,可以使用:

  • 中位数:Series.median()
  • 众数:Series.mode(),但并不是所有数据集都有众数,如[1,2,3,4,5]

同时对多列进行填充:

前向填充:

后向填充:

  • 5、df.replace()

None、np.nan、NaT(时间数据类型的缺失值) 这些都是 Pandas 眼中的缺失值,可以用上面的处理缺失值的方法进行操作,但是有时候在我们人类的眼中,某些异常值也会当做缺失值来处理,例如,在我们的存储的用户信息中,假定我们限定用户都是青年,年龄字段出现了80,我们就可以认为这是一个异常值,再比如,我们都知道性别分为男性(male)和女性(female),在记录用户性别的时候,对于未知的用户性别都记为了 “unknown”,很明显,我们也可以认为 “unknown” 是缺失值,此外,有的时候会出现空白字符串,这些也可以认为是缺失值。

对于上面的这些特殊情况,我们可以使用 replace 方法来替换成缺失值,进而可以使用 Pandas 的处理缺失值的方法进一步处理数据:

可以传入一个字典,进行不同规则的同时替换:

七、重复值的处理

df.drop_duplicates(subset=None, keep='first', inplace=False)

  • subset:设置用哪些列来标识重复项

  • keep:

    • "first":保留第一个重复项,其余删除

    • "last":保留最后一个重复项,其余删除

    • False:删除所有重复项

DataFrame 实例调用 .drop_duplicates() 方法会默认直接删除所有数值都一模一样的多余数据,用参数 keep 决定究竟保存哪个重复值,可以用 subset 参数来决定以哪些字段作为判断依据

  • 八、异常值的处理

检测到了异常值,我们需要对其进行一定的处理,而一般异常值的处理方法可大致分为以下几种:

  • 删除含有异常值的记录:直接将含有异常值的记录删除

  • 视为缺失值:将异常值视为缺失值,利用缺失值处理的方法进行处理

  • 平均值修正:可用前后两个观测值的平均值修正该异常值

  • 不处理:如果异常值具有实际价值,直接在具有异常值的数据集上进行数据挖掘

 

posted @ 2020-05-29 09:33  江畔何人初见月/  阅读(785)  评论(0编辑  收藏  举报