数据预处理中数据的清洗和准备

243 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

1.为什么要进行数据清晰

在数据分析和建模的过程中,相当多的时间需要用在数据的准备上,这些行为包括:加载、清理、转换以及重塑。这些工作会极大的消耗时间,而且有时存储在文件和数据库中的数据的格式不适合特定的任务,所以需要专门的工具对数据格式进行处理,这里我们就会了解如何去处理缺失数据、重复数据、字符串操作和其他分析数据转换的工具。

2.环境配置及要求

  1. python 3.8
  2. numpy 1.23.3
  3. pandas 1.2.4
  4. juptyer note环境运行

3. 处理缺失数据

image.png

import pandas as pd
import numpy as np
string_data=pd.Series({1:'aardasda',2:'saghacv',3:np.nan,4:'asgdac'})#这里NAN就代表数据的缺失值
string_data

首先理解什么是缺失数据,缺失数据即是在一组数据中空出或缺失的数据,pandas中一般就输出为NAN形式。在数据分析中,缺失数据是经常发生的,我们通常称其为哨兵值,可以方便的检测出来。当进行数据清洗以进行分析时,最好直接对缺失数据进行分析,以判断数据采集的问题或缺失值可能导致的偏差。

image.png

string_data[0]=None
string_data.isnull()

3.1 滤除缺失数据

这里的滤除缺失数据,顾名思义就是把缺失的数据过滤掉,我们通常使用dropna来进行数据的过滤。对于Series,dropna返回一个仅含非空数据和索引值的Series:

image.png

from numpy import nan as NA
data=pd.Series([1,NA,3.5,NA,7])
data.dropna()

这里我们导入一个nan,创建一个含有缺失值的数据,再使用dropna()函数对缺失的数据进行过滤,效果很明显,所有缺失的数据都被去除,留下未被处理的数据及其索引。

但是DataFrame对象对数据缺失的处理就比较麻烦的多,我们可能希望丢弃NA或含有NA的行或列。dropna默认丢弃任何含有缺失值的行:

image.png

data=pd.DataFrame([[1.,6.5,3.],[1.,NA,NA],[NA,NA,NA],[NA,6.5,3.]])
cleaned=data.dropna()
cleaned

用how='all'将丢弃全为NA的行。 image.png

data.dropna(how='all')

3.2 填充缺失数据

有些时候可以不去滤除那些数据,而是希望填补那些空洞,通常情况下,fillna方法是最主要的函数,通过一个常数调用fillna就会将缺失值替换为那个常数值:

image.png

df=pd.DataFrame(np.random.randn(7,3))
df.iloc[:4,1]=NA
df.fillna(0)

也可以使用fillna实现许多别的功能。比如说,可以传入Series的平均值或中位数: image.png

data=pd.Series([1.,NA,3.5,NA,7])
data.fillna(data.mean())

4.数据转换

接下来的操作就是过滤、清理以及其他的转换工作。

image.png

data=pd.DataFrame({'k1':['0ne','two']*3+['two'],'k2':[1,2,2,4,5,6,7]})
data

DataFrame的duplicated方法返回一个布尔型Series,表示各行是否是重复行

image.png

data.duplicated()

还有一种方法是根据k1列过滤重复项:

image.png

data['v1']=range(7)
data.drop_duplicates(['k1'])

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

5.字符串操作

大部分文本运算都直接做成了字符串对象的内置方法。对于更为复杂的模式匹配和文本操作,则可能需要用到正则表达式。pandas对此进行了加强,它使你能够对整组数据应用字符串表达式和正则表达式,而且能处理烦人的缺失数据。

5.1字符串对象方法

对于许多字符串处理和脚本应用,内置的字符串方法已经能够满足要求了,例如,以逗号分隔的字符串可以用split拆分成数段:

image.png

val='a,b,  guido'#注意这里面包含了空格
val.split(',')

split常常与strip一起使用,以去除空白符:

image.png

pieces=[x.strip() for x in val.split(',')]
pieces