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

缺失值的判断

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

  1. s = Series(["a","b",np.nan,"c",None])
  2. print(s)
  3. '''
  4. 0 a
  5. 1 b
  6. 2 NaN
  7. 3 c
  8. 4 None
  9. '''
  10. #判断缺失值,如果是则返回True,否则返回False
  11. print(s.isnull())
  12. '''
  13. 0 False
  14. 1 False
  15. 2 True
  16. 3 False
  17. 4 True
  18. '''
  19. #输出缺失值的索引和值
  20. print(s[s.isnull()])
  21. '''
  22. 2 NaN
  23. 4 None
  24. '''

pandas在运算中会自动忽略缺失值。

  1. a = pd.Series([1,2,np.nan,3,None])
  2. a.sum()
  3. 6

此外pandas一共提供了4个针对缺失数据进行操作的函数,分别是isnull(),notnull(),dropna(),fillna()。

  1. a.isnull()
  2. Out[9]:
  3. 0 False
  4. 1 False
  5. 2 True
  6. 3 False
  7. 4 True
  8. dtype: bool
  9. a.notnull()
  10. Out[10]:
  11. 0 True
  12. 1 True
  13. 2 False
  14. 3 True
  15. 4 False
  16. dtype: bool
  17. a.dropna()
  18. Out[11]:
  19. 0 1.0
  20. 1 2.0
  21. 3 3.0
  22. dtype: float64

DataFrame的缺失值过滤

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

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

df.dropna(
axis=0, # 0: 对行进行操作; 1: 对列进行操作
how=’any’ # ‘any’: 只要存在 NaN 就 drop 掉; ‘all’: 必须全部是 NaN 才 drop
)

  1. a = [[1, np.nan, 2],[9,None,np.nan],[3, 4, None],[5,6,7]]
  2. data = pd.DataFrame(a)
  3. data
  4. Out[19]:
  5. 0 1 2
  6. 0 1 NaN 2.0
  7. 1 9 NaN NaN
  8. 2 3 4.0 NaN
  9. 3 5 6.0 7.0
  10. data.dropna()
  11. Out[20]:
  12. 0 1 2
  13. 3 5 6.0 7.0
  14. data.dropna(axis=1)
  15. Out[21]:
  16. 0
  17. 0 1
  18. 1 9
  19. 2 3
  20. 3 5

2、删除全为缺失值的行和列

  1. a = [[1, np.nan, 2],[np.nan,None,np.nan],[3, None, None],[5,None,7]]
  2. data = pd.DataFrame(a)
  3. print(data)
  4. 0 1 2
  5. 0 1.0 NaN 2.0
  6. 1 NaN NaN NaN
  7. 2 3.0 NaN NaN
  8. 3 5.0 NaN 7.0
  9. print(data.dropna(how="all"))
  10. 0 1 2
  11. 0 1.0 NaN 2.0
  12. 2 3.0 NaN NaN
  13. 3 5.0 NaN 7.0
  14. print(data.dropna(how="all",axis=1))
  15. 0 2
  16. 0 1.0 2.0
  17. 1 NaN NaN
  18. 2 3.0 NaN
  19. 3 5.0 7.0

3.使用thresh控制删除的行数

  1. a = [[1, np.nan, 2],[np.nan,None,np.nan],[3, None, None],[5,None,7]]
  2. data = pd.DataFrame(a)
  3. data
  4. Out[35]:
  5. 0 1 2
  6. 0 1.0 NaN 2.0
  7. 1 NaN NaN NaN
  8. 2 3.0 NaN NaN
  9. 3 5.0 NaN 7.0
  10. data.dropna(how="all",thresh=3)
  11. Out[36]:
  12. Empty DataFrame
  13. Columns: [0, 1, 2]
  14. Index: []
  15. data.dropna(how="all",thresh=1)
  16. Out[37]:
  17. 0 1 2
  18. 0 1.0 NaN 2.0
  19. 2 3.0 NaN NaN
  20. 3 5.0 NaN 7.0

df.fillna(value=0)

填充缺失值

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

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

  1. a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
  2. data = DataFrame(a)
  3. print(data)
  4. '''
  5. 0 1 2
  6. 0 1 2.0 2.0
  7. 1 3 NaN 6.0
  8. 2 3 7.0 NaN
  9. 3 5 NaN 7.0
  10. '''
  11. #用0填充所有的缺失数据
  12. print(data.fillna(0))
  13. '''
  14. 0 1 2
  15. 0 1 2.0 2.0
  16. 1 3 0.0 6.0
  17. 2 3 7.0 0.0
  18. 3 5 0.0 7.0
  19. '''

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

  1. a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
  2. data = DataFrame(a)
  3. print(data)
  4. '''
  5. 0 1 2
  6. 0 1 2.0 2.0
  7. 1 3 NaN 6.0
  8. 2 3 7.0 NaN
  9. 3 5 NaN 7.0
  10. '''
  11. print(data.fillna({1:1,2:2}))
  12. '''
  13. 0 1 2
  14. 0 1 2.0 2.0
  15. 1 3 1.0 6.0
  16. 2 3 7.0 2.0
  17. 3 5 1.0 7.0
  18. '''

3、前向填充和后向填充

  1. a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
  2. data = DataFrame(a)
  3. print(data)
  4. '''
  5. 0 1 2
  6. 0 1 2.0 2.0
  7. 1 3 NaN 6.0
  8. 2 3 7.0 NaN
  9. 3 5 NaN 7.0
  10. '''
  11. #前向填充,使用默认是上一行的值,设置axis=1可以使用列进行填充
  12. print(data.fillna(method="ffill"))
  13. '''
  14. 0 1 2
  15. 0 1 2.0 2.0
  16. 1 3 2.0 6.0
  17. 2 3 7.0 6.0
  18. 3 5 7.0 7.0
  19. '''
  20. #后向填充,使用下一行的值,不存在的时候就不填充
  21. print(data.fillna(method="bfill"))
  22. '''
  23. 0 1 2
  24. 0 1 2.0 2.0
  25. 1 3 7.0 6.0
  26. 2 3 7.0 7.0
  27. 3 5 NaN 7.0
  28. '''

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

  1. a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
  2. data = DataFrame(a)
  3. print(data)
  4. '''
  5. 0 1 2
  6. 0 1 2.0 2.0
  7. 1 3 NaN 6.0
  8. 2 3 7.0 NaN
  9. 3 5 NaN 7.0
  10. '''
  11. print(data.fillna(data.mean()))
  12. '''
  13. 0 1 2
  14. 0 1 2.0 2.0
  15. 1 3 4.5 6.0
  16. 2 3 7.0 5.0
  17. 3 5 4.5 7.0
  18. '''