pandas缺失值的处理
缺失值的处理
缺失值的类型
- numpy库中的:np.nan/ np.NaN,不区分大小写
- None,区分大小写
- pandas中:pd.NA/pd.NaT:区分大小写
缺失值判断
#isna()/isnull()
data = [[3,8,31],
[np.nan,np.nan,2],
[np.nan,np.nan,np.nan],
[10,1,np.nan],
[5,8,12]]
df = pd.DataFrame(data=data,columns=list("abc"))
print(df)
print(df.isnull())
print(df.isna())
#isnull与isna的输出结果是一样的是布尔型
"""
a b c
0 False False False
1 True True False
2 True True True
3 False False True
4 False False False
"""
#notna()/notnull()
#notna/notnull与isna/isnull的输出结果刚好相反
缺失值的计算
#缺失值的个数
data = [[3,8,31],
[np.nan,np.nan,2],
[np.nan,np.nan,np.nan],
[10,1,np.nan],
[5,8,12]]
df = pd.DataFrame(data=data,columns=list("abc"))
print(df)
print(df.isna().sum()) #每列缺失值的个数
print(df.isna().sum(axis=1)) #每行缺失值的个数
print(df.isna().mean())#计算每列的缺失率
print(df.isna().mean(axis=1))#计算每行的缺失率
#此外在还可以对包含缺失值的函数进行运算,在df.sum()/df.mean()时,是没有考虑缺失值的,而累计求和以及累积乘积
#缺失值对应的行或列,依然是NA值
print(df["a"])
print(df["a"].cumsum())
"""
#输出结果
0 3.0
1 NaN
2 NaN
3 10.0
4 5.0
Name: a, dtype: float64
0 3.0
1 NaN
2 NaN
3 13.0
4 18.0
"""
缺失值的筛选
data = [[3,8,31],
[np.nan,np.nan,2],
[np.nan,np.nan,np.nan],
[10,1,np.nan],
[5,8,12]]
df = pd.DataFrame(data=data,columns=list("abc"))
a = df.loc[df.isna().any(axis=1)] #对含有缺失值的行进行筛选,any是满足任意一个条件即可
a = df.loc[~df.isna().any(axis=1)] #any的反向操作
a = df.loc[df.notna().all(axis=1)] #all,全都不是na值
a = df.loc[~df.notna().all(axis=1)] #all的反向操作,全都不是na值
缺失值的填充
data = [[3,8,31],
[np.nan,np.nan,2],
[np.nan,np.nan,np.nan],
[10,1,np.nan],
[5,8,12]]
df = pd.DataFrame(data=data,columns=list("abc"))
df.fillna(6666)#缺失值全部用常数666进行填充
df.fillna({"a":1,"b":2,"c":3})#也可通过字典对特定的列进行指定填充
#一些个性化的操作
print(df)
df.fillna(method = "ffill",inplace=True)#默认情况下用前面的数据行进行填充
df.fillna(method = "pad",inplace=True)#与method = "ffill"等价
a = df.fillna(method = "ffill",limit=1)#limit对填充的数量进行限制,只填充一次
a = df.fillna(method = "bfill",limit=1)#limit对填充的数量进行限制,只填充一次
缺失值删除
data = [[3,8,31],
[np.nan,np.nan,2],
[np.nan,np.nan,np.nan],
[10,1,np.nan],
[5,8,12]]
df = pd.DataFrame(data=data,columns=list("abc"))
print(df)
a = df.dropna(axis=0)#删除缺失值所在的行
a = df.dropna(axis=1)#删除缺失值所在的列
a = df.dropna(subset=["a"],axis=0)#subset,里面可以是列表,也可以是单个元素;删除"a"列中的空元素
记录学习的点点滴滴