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"列中的空元素
posted @ 2023-02-20 11:16  小杨的冥想课  阅读(41)  评论(0编辑  收藏  举报