3-Pandas数据初探索之缺失值处理与丢弃数据(填充fillna()、删除drop()、drop_duplicates()、dropna())
一、了解缺失值
- 通常使用 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
2)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