一、了解缺失值
- 通常使用 NA('not available')来代指缺失值
- 在Pandas的数据结构中,缺失值使用 NaN('Not a Number')进行标识
除了汇总统计方法,还可以使用isnull()来对数据中缺失的样本占比、特征大致的缺失情况进行了解。
>>> df =pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),
... 'two':pd.Series([1,3,2,7],index=['a','b','c','d']),
... 'three':pd.Series([3,8,3],index=['d','a','c'])})
>>> df
one two three
a 1.0 1 8.0
b 2.0 3 NaN
c 3.0 2 3.0
d NaN 7 3.0
#缺失值的数量分析
>>> df.isnull()
one two three
a False False False
b False False True
c False False False
d True False False
>>> df.isnull().sum()
one 1
two 0
three 1
dtype: int64
二、缺失值填充---fillna()
使用fillna()方法进行缺失值填补
填充方式分为以下几种:
(1)使用同一个值填补所有的缺失值
>>> df.fillna('用我填充')
one two three
a 1 1 8
b 2 3 用我填充
c 3 2 3
d 用我填充 7 3
(2)向前填充、向后填充--->通过设置参数method参数来实现
method参数 | 说明 |
ffill或pad | 向前填充值 |
bfill或backfill | 向后填充值 |
#向前填充
>>> df.fillna(method='pad')
one two three
a 1.0 1 8.0
b 2.0 3 8.0
c 3.0 2 3.0
d 3.0 7 3.0
#向后填充
>>> df.fillna(method='bfill')
one two three
a 1.0 1 8.0
b 2.0 3 3.0
c 3.0 2 3.0
d NaN 7 3.0
(3)对不同列的缺失值使用不同的值进行填补
使用字典的方式,如下:
>>> df.fillna({'one':1,'three':3})
one two three
a 1.0 1 8.0
b 2.0 3 3.0
c 3.0 2 3.0
d 1.0 7 3
(4)使用一个Pandas的自动对齐功能进行填补
最常使用的一种方式
>>> df.fillna(df.mean())
one two three
a 1.0 1 8.000000
b 2.0 3 4.666667
c 3.0 2 3.000000
d 2.0 7 3.000000
三、丢弃数据
根据某些过滤条件丢弃部分无用数据,在多数情况下数据过滤可以同时达到获取和丢弃数据的目的。
除了使用布尔表达式之外,Pandas对象还有以下三种方法来丢弃无用数据:
- drop():根据标签丢弃数据
- drop_duplicates():丢弃重复数据
- dropna():丢失缺失数据
(1)根据标签丢弃数据----drop()
drop()可以根据标签丢弃多行或多了数据,基本参数如下:
labels:单个或者多个标签,传入类列表值(列表、array等)
axis:丢弃行(0,默认)或者列(1)
inplace:是否用结果替换原pandas对象(默认False)
#仍然以上述的df为例
>>> df
one two three
a 1.0 1 8.0
b 2.0 3 NaN
c 3.0 2 3.0
d NaN 7 3.0
>>> df.drop(['d','c'])
one two three
a 1.0 1 8.0
b 2.0 3 NaN
>>> df.drop(labels=['d','c'])
one two three
a 1.0 1 8.0
b 2.0 3 NaN
>>> df.drop(labels=['three'],axis=1)
one two
a 1.0 1
b 2.0 3
c 3.0 2
d NaN 7
(2)丢弃重复数据----drop_duplicates()
1)由于不同的原因,数据中可能会包含重复出现的行(记录),重复的记录会造成信息的冗余,但是在实际中丢弃重复数据需要谨慎,盲目去重可以会造成数据集丢失部分数据。
duplicated()方法可以返回一个布尔型的Series,表示各行是否重复,仅仅将重复的最后一行标记为True;
注:duplicated()方法有参数keep,keep的值有一下三种情况:
keep = 'first'---->返回结果中的第一个重复的数据
keep = 'last'----->返回结果中的最后一个重复的数据
keep = False------>所有的重复数据为True
#先创建一个new_df,与df中有重复的记录
>>> new =pd.DataFrame({'one':pd.Series([1,3],index=['e','f']),'two':pd.Series([1,2],index=['e','f']),'three':pd.Series([8,3],index=['e','f'])})
>>> new
one two three
e 1 1 8
f 3 2 3
>>> new_df = pd.concat([df,new])
>>> new_df
one two three
a 1.0 1 8.0
b 2.0 3 NaN
c 3.0 2 3.0
d NaN 7 3.0
e 1.0 1 8.0
f 3.0 2 3.0
#查看各行是否重复
>>> new_df.duplicated()
a False
b False
c False
d False
e True
f True
dtype: bool
#通过布尔过滤可以丢弃重复数据
>>> new_df[new_df.duplicated()==False]
one two three
a 1.0 1 8.0
b 2.0 3 NaN
c 3.0 2 3.0
d NaN 7 3.0
>>> new_df.duplicated(keep='first')
a False
b False
c False
d False
e True
f True
dtype: bool
>>> new_df.duplicated(keep=False)
a True
b False
c True
d False
e True
f True
dtype: bool
Pandas提供的drop_duplicates()可以更加简便的完成去重操作,默认情况下会判断全部列,若只希望根据某一列判断重复项,则在括号后加入列即可。
>>> new_df.drop_duplicates()
one two three
a 1.0 1 8.0
b 2.0 3 NaN
c 3.0 2 3.0
d NaN 7 3.0
>>> new_df.drop_duplicates('three')
one two three
a 1.0 1 8.0
b 2.0 3 NaN
c 3.0 2 3.0
>>> new_df.drop_duplicates(['one','three'])
one two three
a 1.0 1 8.0
b 2.0 3 NaN
c 3.0 2 3.0
d NaN 7 3.0
(3)丢弃缺失值数据----dropna()
在含有缺失值样本比例较小的情况下,可以考虑丢弃缺失值所在的行,或者说一个特征大部分都是缺失值是,也可以考虑丢弃该特征。
dropna()方法用于丢弃缺失值相关数据,其常用的参数如下:
axis:丢弃缺失值所在的行(0,默认)或所在列(1);
how:'any'表示只要存在缺失值就丢弃(默认),'all'表示所有的值均为缺失值才丢弃;
subset:考虑部分行和列
inplace:是否替换原来的Pandas对象
#仍以df为例,此时若要删除存在缺失值所在的行,则
>>> df.dropna(how='any')
one two three
a 1.0 1 8.0
c 3.0 2 3.0
#若删除three列,则
>>> df.drop(columns='three',inplace=True)
>>> df
one two
a 1.0 1
b 2.0 3
c 3.0 2
d NaN 7