在实际应用中对于数据进行分析的时候,经常能看见缺失值,下面来介绍一下如何利用pandas来处理缺失值。常见的缺失值处理方式有,过滤、填充。

一、缺失值的判断

pandas使用浮点值NaN(Not a Number)表示浮点数和非浮点数组中的缺失值,同时python内置None值也会被当作是缺失值。

a、Series的缺失值判断

  s = Series(["a","b",np.nan,"c",None])
  print(s)
  '''
  0    a
  1    b
  2   NaN
  3    c
  4  None
  '''
  #判断缺失值,如果是则返回True,否则返回False
  print(s.isnull())
  '''
  0  False
  1  False
  2   True
  3  False
  4   True
  '''
  #输出缺失值的索引和值
  print(s[s.isnull()])
  '''
  2   NaN
  4  None
  '''

b、DataFrame的缺失值判断

  a = [[1,np.nan,2],[3,4,None]]
  data = DataFrame(a)
  #DataFrame的None值变成了NaN
  print(data)
  '''
    0  1  2
  0 1 NaN 2.0
  1 3 4.0 NaN
  '''
  print(data.isnull())
  '''
      0   1   2
  0 False  True False
  1 False False  True
  '''
  print(data[data.isnull()])
  '''
    0  1  2
  0 NaN NaN NaN
  1 NaN NaN NaN
  '''

注意:在使用Series和DataFrame的时候,如果其中有值为None,Series会输出None,而DataFrame会输出NaN,但是对空值判断没有影响。DataFrame使用isnull方法在输出空值的时候全为NaN,因为DataFrame对于False对应的位置,输出值会使用NaN代替,而Series对于Fasel对应的位置是没有输出值的。

二、过滤缺失数据

a、Series的缺失值过滤

  s = Series(["a","b",np.nan,"c",None])
  #通过使用notnull方法来获取非缺失数据
  print(s[s.notnull()])
  '''
  0  a
  1  b
  3  c
  '''
  #使用dropna方法删除缺失数据,返回一个删除后的Series
  print(s.dropna())
  '''
  0  a
  1  b
  3  c
  '''
  #并没有在原来的Series上进行直接删除
  print(s)
  '''
  0    a
  1    b
  2   NaN
  3    c
  4  None
  '''
  #通过设置inplace参数为True,在原Series上进行删除,不会返回Series
  print(s.dropna(inplace=True))
  #None
  print(s)
  '''
  0  a
  1  b
  3  c
  '''

b、DataFrame的缺失值过滤

DataFrame删除缺失值相对于Series而言就要复杂一些,也许有的时候你是想删除含有缺失值的行或列,也许有时候你需要删除的是,当整行或整列全为缺失值的时候才删除,好在pandas对于这两种情况都有相对应的处理方法。

1、删除含有缺失值的行和列

  a = [[1, np.nan, 2],[9,None,np.nan],[3, 4, None],[5,6,7]]
  data = DataFrame(a)
  print(data)
  '''
    0  1  2
  0 1 NaN 2.0
  1 9 NaN NaN
  2 3 4.0 NaN
  3 5 6.0 7.0 
  '''
  #使用dropna方法删除含有缺失值的行,默认是行
  print(data.dropna())
  '''
    0  1  2
  3 5 6.0 7.0
  '''
  #删除含有缺失值的列
  print(data.dropna(axis=1))
  '''
    0
  0 1
  1 9
  2 3
  3 5
  '''

2、删除全为NaN的行和列

   a = [[1, np.nan, 2],[np.nan,None,np.nan],[3, None, None],[5,None,7]]
  data = DataFrame(a)
  print(data)
  '''
     0  1  2
  0 1.0 NaN 2.0
  1 NaN NaN NaN
  2 3.0 NaN NaN
  3 5.0 NaN 7.0
  '''
  #当行全为NaN的时候,才删除,参数how默认是any,含有缺失值就删除
  print(data.dropna(how="all"))
  '''
     0  1  2
  0 1.0 NaN 2.0
  2 3.0 NaN NaN
  3 5.0 NaN 7.0
  '''
  #当列全为NaN的时候,才删除
  print(data.dropna(how="all",axis=1))
  '''
     0  2
  0 1.0 2.0
  1 NaN NaN
  2 3.0 NaN
  3 5.0 7.0
  '''

dropna方法的inplace的设置与Series一样。

3、指定删除数据后显示部分数据观察

  a = [[1, np.nan, 2],[np.nan,None,np.nan],[3, None, None],[5,None,7]]
  data = DataFrame(a)
  print(data)
  '''
     0  1  2
  0 1.0 NaN 2.0
  1 NaN NaN NaN
  2 3.0 NaN NaN
  3 5.0 NaN 7.0
  '''
  #当行全为NaN的时候,才删除,参数how默认是any,含有缺失值就删除
  print(data.dropna(how="all"))
  '''
     0  1  2
  0 1.0 NaN 2.0
  2 3.0 NaN NaN
  3 5.0 NaN 7.0
  '''
  #通过thresh参数来控制显示删除数据的条数,删除列的时候thresh参数无效
  print(data.dropna(how="all",thresh=2))
  '''
     0  1  2
  0 1.0 NaN 2.0
  3 5.0 NaN 7.0
  '''

三、填充缺失值

数据都是宝贵的,也许有时候你的数据不够多,因为数据越多对于模型的训练,数据分析都是有好处的,所以很多的时候我们都不想删除数据。通常情况下,也许你会选择用一些特殊值来填充缺失值。下面介绍使用pandas的fillna方法来填充缺失数据。

1、指定特殊值填充缺失值

  a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
  data = DataFrame(a)
  print(data)
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 NaN 6.0
  2 3 7.0 NaN
  3 5 NaN 7.0
  '''
  #用0填充所有的缺失数据
  print(data.fillna(0))
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 0.0 6.0
  2 3 7.0 0.0
  3 5 0.0 7.0
  '''

2、不同列使用不同的填充值

  a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
  data = DataFrame(a)
  print(data)
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 NaN 6.0
  2 3 7.0 NaN
  3 5 NaN 7.0
  '''
  print(data.fillna({1:1,2:2}))
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 1.0 6.0
  2 3 7.0 2.0
  3 5 1.0 7.0
  '''

3、前向填充和后向填充

  a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
  data = DataFrame(a)
  print(data)
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 NaN 6.0
  2 3 7.0 NaN
  3 5 NaN 7.0
  '''
  #前向填充,使用默认是上一行的值,设置axis=1可以使用列进行填充
  print(data.fillna(method="ffill"))
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 2.0 6.0
  2 3 7.0 6.0
  3 5 7.0 7.0
  '''
  #后向填充,使用下一行的值,不存在的时候就不填充
  print(data.fillna(method="bfill"))
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 7.0 6.0
  2 3 7.0 7.0
  3 5 NaN 7.0
  '''

4、使用列的平均值进行填充

  a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
  data = DataFrame(a)
  print(data)
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 NaN 6.0
  2 3 7.0 NaN
  3 5 NaN 7.0
  '''
  print(data.fillna(data.mean()))
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 4.5 6.0
  2 3 7.0 5.0
  3 5 4.5 7.0
  '''

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。