三、数据清洗与准备-处理缺失值

"""
    pandas使用浮点值NaN来表示缺失值

    ▶知识点1:NA处理方法:
            函数名                 描述
        --------------------------------------------------------------------------------------------
            dropna          根据每个标签的值是否是缺失数据来筛选轴标签,并根据允许缺失的数据量来确定阈值
            fillna          用某些值填充缺失的数据或使用插值方法(如"ffill"或"bfill")
            isnull          返回表明哪些值是缺失值的布尔值
            notnull         isnull的反函数
"""
import numpy as np
import pandas as pd

obj = pd.Series(["A", "B", np.nan, "C", "D"])
print(obj)
print(obj.isnull())
"""
0    False
1    False
2     True
3    False
4    False
dtype: bool
"""

"""
    ▶知识点2:过滤缺失值
        有多种过滤缺失值的方法
        虽然可以使用pandas.isnull和布尔值索引手动的过滤缺失值,但dropna在过滤缺失值时是非常有用的。
        在Series上使用dropna,会返回Series中所有的非空数据及索引值
"""
s1 = pd.Series([1, np.nan, 5, np.nan, 9])
print(s1.dropna())  # s1.dropna()和s1[s1.notnull()]是等价的
"""
0    1.0
2    5.0
4    9.0
dtype: float64
"""

df_1 = pd.DataFrame([[1., np.nan, 3.3], [2.2, 4.4, np.nan], [np.nan, np.nan, np.nan], [5.5, 6.6, 7.7]])
print(df_1)
"""
     0    1    2
0  1.0  NaN  3.3
1  2.2  4.4  NaN
2  NaN  NaN  NaN
3  5.5  6.6  7.7
"""

# ▶知识点3:dropna默认情况下是删除包含缺失值的【行】
print(df_1.dropna())
"""
     0    1    2
3  5.5  6.6  7.7
"""

# ▶知识点4:传入 how="all" 时,将删除【所有值均为NA】的【行】
print(df_1.dropna(how="all"))
"""
     0    1    2
0  1.0  NaN  3.3
1  2.2  4.4  NaN
3  5.5  6.6  7.7
"""

# ▶知识点5:如果想要删除【列】,传入参数【axis=1】或者【axis="columns"】
df_1[3] = np.nan
print(df_1.dropna(how="all", axis="columns"))
"""
     0    1    2
0  1.0  NaN  3.3
1  2.2  4.4  NaN
2  NaN  NaN  NaN
3  5.5  6.6  7.7
"""

# ▶知识点6:如果【想要保留一定数量】的观察值的行,【设置参数thresh】即可
print(df_1.dropna(thresh=3))  # thresh 脱粒
"""
     0    1    2   3
3  5.5  6.6  7.7 NaN
"""

"""
    ▶知识点7:补全缺失值
        大多数情况下,主要使用fillna方法来补全缺失值
        调用fillna时,可以使用一个常数来替代缺失值
        
        fillna函数参数
            参数                      描述
        ---------------------------------------------------------------
            value               标量值或字典型对象用于填充缺失值
            method              插值方法,如果没有其他参数,默认是"ffill"
            axis                需要填充的轴,默认axis=0
            inplace             修改被调用的对象,而不是生成一个备份
            limit               用于向前或向后填充时最大的填充范围
"""
print(df_1.fillna(9.9))
"""
     0    1    2    3
0  1.0  9.9  3.3  9.9
1  2.2  4.4  9.9  9.9
2  9.9  9.9  9.9  9.9
3  5.5  6.6  7.7  9.9
"""

# ▶知识点8:在调用fillna时使用字典,可以为【不同列】设置不同的填充值
print(df_1.fillna({1: 100, 2: 200, 3: 300, 4: 0}))
"""
     0      1      2      3
0  1.0  100.0    3.3  300.0
1  2.2    4.4  200.0  300.0
2  NaN  100.0  200.0  300.0
3  5.5    6.6    7.7  300.0
"""

# ▶知识点9:fillna返回的是一个新的对象,也可以设置参数inplace=True来修改已存在的对象
df_1.fillna(0, inplace=True)
print(df_1)
"""
     0    1    2    3
0  1.0  0.0  3.3  0.0
1  2.2  4.4  0.0  0.0
2  0.0  0.0  0.0  0.0
3  5.5  6.6  7.7  0.0
"""

df_2 = pd.DataFrame(np.random.randn(6, 3))
df_2.iloc[2:, 1] = np.nan
df_2.iloc[4:, 2] = np.nan
print(df_2)
"""
          0        1         2
0  0.301150  2.58441 -1.113866
1  0.947403 -0.54039  0.820059
2 -1.534092      NaN  2.142038
3  0.381867      NaN  0.254660
4 -1.112075      NaN       NaN
5 -1.404536      NaN       NaN
"""
print(df_2.fillna(method="ffill"))
"""
          0        1         2
0  0.301150  2.58441 -1.113866
1  0.947403 -0.54039  0.820059
2 -1.534092 -0.54039  2.142038
3  0.381867 -0.54039  0.254660
4 -1.112075 -0.54039  0.254660
5 -1.404536 -0.54039  0.254660
"""
print(df_2.fillna(method="ffill", limit=1))
"""
          0        1         2
0  0.301150  2.58441 -1.113866
1  0.947403 -0.54039  0.820059
2 -1.534092 -0.54039  2.142038
3  0.381867      NaN  0.254660
4 -1.112075      NaN  0.254660
5 -1.404536      NaN       NaN
"""

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值