《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

第7章 数据清洗和准备

7.1 处理缺失数据

pandas使用浮点值NaN(Not a Number)表示缺失数据,我们称其为哨兵值。

缺失数据处理的函数: 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

  • 滤除缺失数据

对于一个series,dropna返回一个仅含非空数据和索引值的series。data.dropna() = data[data.notnull()]。

对于DataFrame对象,dropna默认丢弃任何含有缺失值的行,传入how=‘all’将只丢弃全为NA的那些行。传入axis=1,如data.dropna(axis=1, how=‘all’)可丢弃列。

用thresh参数实现留下一部分观测数据: 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

  • 填充缺失数据

fillna函数填补缺失数据 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

fillna函数参数: 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

7.2数据转换

  • 移除重复数据

DataFrame的duplicated方法返回一个布尔型Series,表示各行是否是重复行(前面出现过的行)。

这个drop_duplicates方法是对DataFrame格式的数据,去除特定列下面的重复行,返回DataFrame格式的数据。

duplicated和drop_duplicates默认保留的是第一个出现的值的组合。传入keep=‘last’则保留最后一个。

  • 利用函数或映射进行数据转换

Series的map方法可以接受一个函数或含有映射关系的字典型对象。

  • 替换值

replace()方法把字符串中的旧值替换成新值

data.replace方法与data.str.replace不同,后者做的是字符串的元素级替换。

  • 重命名轴索引

rename可以结合字典型对象实现对部分轴标签的更新 。

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

rename可以实现复制DataFrame并对其索引和列标签进行赋值,若希望就地修改某个数据集,传入inplace=True。

  • 离散化和面元划分

连续数据被离散化或拆分为“面元”(bin)使用pandas的cut函数,pandas返回的是一个特殊的Categorical对象,结果展示了pandas.cut划分的面元。pd.value_counts(cats)是pandas.cut结果的面元计数。

跟“区间”的数学符号一样,圆括号表示开端,方括号则表示闭端(包括)。哪边是闭端可以通过right=False进行修改。

传递一个列表或数组到labels,设置自己的面元名称。

向cut传入的是面元的数量而不是确切的面元边界,则它会根据数据的最小值和最大值计算等长面元。选项precision=2,限定小数只有两位。 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

qcut类似cut函数,可根据样本分位数对数据进行面元划分。根据数据的分布情况,cut可能无法使各个面元中含有相同数量的数据点,而qcut由于使用的是样本分位数,则可以得到大小基本相等的面元。qcut也可以传递自定义的分位数。 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

  • 检测和过滤异常值

numpy中产生随机数的函数randn()和rand(),numpy.random.randn(do,d1,..,dn)是从标准正态分布中返回一个或多个样本值。numpy.random.rand(d0,d1,…,dn)的随机样本位于[0,1)中。

找出某列中绝对值大小超过3的值: 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

选出全部含有“超过3或-3的值”的行,在布尔型DataFrame中使用any方法:

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

np.sign(a):计算个元素的符号值1(+),0,-1(-)

  • 排列和随机采样

numpy.random.permutation函数能实现对Series或DataFrame的列的排列工作(permuting,随机重排序)

  • 计算指标/哑变量

常用于统计建模或机器学习的转换方式是:将分类变量(categorical variable)转换为“哑变量”或“指标矩阵”。

pandas的get_dummies函数可以实现:若DataFrame的某一列中含有k个不同的值,则可以拍声出一个k列矩阵或DataFrame(其值全为1和0)。 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

get_dummies的prefix参数能实现给指标DataFrame的列加上前缀,以便能够跟其他数据进行合并。 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

7.3 字符串操作

  • 字符串对象方法

以逗号分隔的字符串可以用split拆分成数段: 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

split常常与strip一起使用,以去除空白符(包括换行符): 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

子串定位,检测子串的最佳方式是利用Python的in关键字,还可以使用index和find: 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

find和index的区别:若找不到字符串,index将会引发一个异常(而不是返回-1)。

count可以返回制定子串的出现次数: 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

replace用于将制定模式替换为另一个模式。通过传入空字符串,它也常常用于删除模式: 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备  

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

Python casefold()方法是Python3.3版本之后引入的,其效果和lower()方法非常相似,都可以转换字符串中所有大写字符为小写。两者区别:lower()方法只对ASCII编码,也就是’A-Z’有效,对于其他语言(非汉语或英语)中把大写转换为小写的情况只能用casefold()方法。

  • 正则表达式

Python内置的re模块负责对字符串应用正则表达式,re模块的函数分为三大类:模式匹配、替换以及拆分。

若对许多字符串应用同一条正则表达式,通过re.compile创建regex对象。

match和search跟findall功能类似,findall返回的是字符串中所有的匹配项,而search是返回第一个匹配项,match只匹配字符串的首部。 

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备

  • pandas的矢量化字符串函数

通过data.map,所有字符串和正则表达式方法都能被应用于(传入lambda表达式或其他函数)各个值,但是存在NA(null)就会报错。

pandas字符串方法:

《利用Python进行数据分析》学习笔记 第7章 数据清洗和准备