"""
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
"""
三、数据清洗与准备-处理缺失值
最新推荐文章于 2024-06-13 02:59:24 发布