为了账号安全,请及时绑定邮箱和手机立即绑定

Python数据处理从零开始----第三章(pandas)②处理缺失数据

标签:
Python

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

缺失值的判断

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

 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
    '''

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

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

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

a.isnull()
Out[9]: 
0    False1    False2     True3    False4     Truedtype: bool

a.notnull()
Out[10]: 
0     True1     True2    False3     True4    Falsedtype: bool

a.dropna()
Out[11]: 
0    1.01    2.03    3.0dtype: float64

DataFrame的缺失值过滤

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

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

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

a = [[1, np.nan, 2],[9,None,np.nan],[3, 4, None],[5,6,7]]
data = pd.DataFrame(a)
data


Out[19]: 
   0    1    20  1  NaN  2.01  9  NaN  NaN2  3  4.0  NaN3  5  6.0  7.0data.dropna()
Out[20]: 
   0    1    23  5  6.0  7.0data.dropna(axis=1)
Out[21]: 
   00  11  92  33  5

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

a = [[1, np.nan, 2],[np.nan,None,np.nan],[3, None, None],[5,None,7]]
data = pd.DataFrame(a)
print(data)     0   1    20  1.0 NaN  2.01  NaN NaN  NaN2  3.0 NaN  NaN3  5.0 NaN  7.0print(data.dropna(how="all"))     0   1    20  1.0 NaN  2.02  3.0 NaN  NaN3  5.0 NaN  7.0print(data.dropna(how="all",axis=1))     0    20  1.0  2.01  NaN  NaN2  3.0  NaN3  5.0  7.0

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

a = [[1, np.nan, 2],[np.nan,None,np.nan],[3, None, None],[5,None,7]]
data = pd.DataFrame(a)
data
Out[35]: 
     0   1    20  1.0 NaN  2.01  NaN NaN  NaN2  3.0 NaN  NaN3  5.0 NaN  7.0data.dropna(how="all",thresh=3)
Out[36]: 
Empty DataFrame
Columns: [0, 1, 2]
Index: []

data.dropna(how="all",thresh=1)
Out[37]: 
     0   1    20  1.0 NaN  2.02  3.0 NaN  NaN3  5.0 NaN  7.0

df.fillna(value=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
    '''



作者:夜神moon
链接:https://www.jianshu.com/p/e8c3c99a5d63


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消