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对象还有以下三种方法来丢弃无用数据:

  1. drop():根据标签丢弃数据
  2. drop_duplicates():丢弃重复数据
  3. 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

 

posted @ 2020-07-26 22:06  大脸猫12581  阅读(1224)  评论(0编辑  收藏  举报