数据预处理
数据清洗
- 数据清洗目的:将脏数据(这里指是对数据分析没有意义、格式非法、不在指定范围的数据)清洗干净,是原数据具有完整性、唯一性、权威性、合法性、一致性等特点。
- pandas常见数据清洗:空值和缺失值的处理,重复值的处理,异常值的处理,统一数据格式。
空值和缺失值的处理
- 空值:数据未知,不适用或将在以后添加数据。None
- 缺失值:数据集中或某些属性的值是不完整的,产生的原因主要有人为原因和机械原因,机器原因是由于机械故障未能是搜集或存储失败,认为原因是由主观失误或有意隐瞒造成。NaN
- 使用isnull和notnull函数可以判断数据集中是否存在空值和缺失值,对于缺失数据可以使用dropna()和fillna()方法进行删除和填充
- isnull()函数和notnull()函数
- isnull()函数和notnull()函数的语法格式如下:
pandas.isnull(obj) 存在NaN或者None的话则就将在这个位置标记True,否则标记False
pandas.notnull(obj) 存在NaN或者None的话则就将在这个位置标记False,否则标记True
ser_obj = Series([1,NaN,None]) #notnull
pd.notnull(ser_obj)
0 True
1 False
2 False
dtype: bool
pd.isnull(ser_obj) #isnull
0 False
1 True
2 True
dtype: bool
pd.isna(ser_obj) #isna
0 False
1 True
2 True
dtype: bool
- dropna()方法
- dropna()的方法是删除含有空值和缺失值的行和列,
- dropna(axis=0,how=‘any’,thresh=None,subset=None,inplace=False)
- axis:确定过滤行或列,取值可以为
0或index:删除包含缺失值的行,默认为0
1或columns:删除包含缺失值的列
- how:
any:默认值,如果存在NaN值,则删除该行或者该列
all:如果所有值都是NaN值,则删除该行或者该列
- thresh:表示有效数据量的最小要求,若传入了2,则是要求该行或该列至少有两个非NaN值时将其保留
- subset:表示在特定的子集中寻找空值
- inplace:表示是否在原数据上操作,如果设置为True,则表示修改源数据,如果设置为False,则表示修改原数据的副本,返回新的数据
df_obj = pd.DataFrame({'类别':['小说','随笔散文','青春文字','传记'],
'书名':[NaN,'《皮囊》','《旅行结束时》','《老舍自传》'],
'作者':['老舍',None,'张琪新','老舍']})
df_obj
类别 书名 作者
0 小说 NaN 老舍
1 随笔散文 《皮囊》 None
2 青春文字 《旅行结束时》 张琪新
3 传记 《老舍自传》 老舍
df_obj.dropna()
类别 书名 作者
2 青春文字 《旅行结束时》 张琪新
3 传记 《老舍自传》 老舍
- 填充空值和缺失值
- 填充空值和缺失值的方法有很多,比如人工填写,特殊值填写,热卡填充等,在pd中的fillna()方法可以实现填充空值或缺失值
- fillna(
value=None,
method=None,
axis=None,
inplace=False,
limit=None,
downcast=None,
**kwargs,
) - value:用于填充的数值
- method:表示填充方式,默认值为None,另外还有以下取值
ffill:将最后一个有效数据向后传播,也就是说用缺失值前面以得一个值代替缺失值
bfill:将最后一个有效值向前传播,也就是说用缺失值后面的一个值代替缺失值
limit:可以连续填充的最大数量,默认为None
df_obj = pd.DataFrame({'A':[1.0,2.0,3.0,NaN],'B':[NaN,2.0,NaN,6.0],'C':['a',7,8,9],'D':[NaN,2.0,3.0,NaN]})
df_obj #查看原数据
A B C D
0 1.0 NaN a NaN
1 2.0 2.0 7 2.0
2 3.0 NaN 8 3.0
3 NaN 6.0 9 NaN
df_obj.fillna(66) #使用66进行填充
A B C D
0 1.0 66.0 a 66.0
1 2.0 2.0 7 2.0
2 3.0 66.0 8 3.0
3 66.0 6.0 9 66.0
df_obj.fillna({'A':5.0,'B':8.0,'C':99}) #传入字典根据索引进行填充
A B C D
0 1.0 8.0 a NaN
1 2.0 2.0 7 2.0
2 3.0 8.0 8 3.0
3 5.0 6.0 9 NaN
df_obj.fillna(method='bfill') #使用缺失值后边一个的数据进行填充
A B C D
0 1.0 2.0 a 2.0
1 2.0 2.0 7 2.0
2 3.0 6.0 8 3.0
3 NaN 6.0 9 NaN
重复值的处理
- 当数据出先重复值的时候,大部分时间都需要把重复值进行删除,pandas提供了两个方法专门处理数据中的重复值,分别为duplicated()和drop_duplicates()方法
- duplicated:确认是否有缺失值
- drop_duplicates:删除缺失值
- 使用duplicated()方法处理重复值
duplicated(subset=None,keep=‘first’)
- subset:用于识别重复的列标或列标签序列,默认识别所有的列标签
- keep:删除重复项并保留第一次出现的项,取值可以为first,last,False(first:从前向后查找,除了第一次出现外,其余相同的标记为重复,last:从后向前查找,除了最后一次出现外,其余相同的标记为重复,False:所有相同的都标为重复)
df_obj = pd.DataFrame({'id':[1,2,3,4,4,5],
'name':['小鸣','小月月','彭艳','硫化','硫化','周华'],
'age':[18,18,29,58,58,36],
'height':[180,180,185,175,175,178],
'gender':['女','女','男','男','男','男']})
df_obj
id name age height gender
0 1 小鸣 18 180 女
1 2 小月月 18 180