•本文字数:约1300字•阅读时长:约2分钟•难度:2颗星
数据缺失主要包括记录缺失和字段信息缺失等情况,其对数据分析会有较大影响,导致结果不确定性更加显著。
缺失值的处理:
删除记录 / 数据填充|替换/ 不处理
判断是否有缺失值 - isnull()/notnull()
# isnull:缺失值为True,非缺失值为False
# notnull:缺失值为False,非缺失值为True
s = pd.Series([1,np.nan,np.nan,2,3,np.nan,4])
df = pd.DataFrame({'value1':[1,np.nan,np.nan,2,3,np.nan,4],
'value2':['a','b','c',np.nan,'e','f',np.nan]})
print(s.isnull()) # Series直接判断是否是缺失值,返回一个Series
print(df.notnull()) # Dataframe直接判断是否是缺失值,返回一个Series
print(df['value1'].notnull()) # 通过索引判断
print('------')
# 筛选非缺失值
s2 = s[s.isnull() == False]
df2 = df[df['value2'].notnull()] # 注意和 df2 = df[df['value2'].notnull()] ['value1'] 的区别
print(s2)
print(df2)
0 False 1 True 2 True 3 False 4 False 5 True 6 False dtype: bool value1 value2 0 True True 1 False True 2 False True 3 True False 4 True True 5 False True 6 True False 0 True 1 False 2 False 3 True 4 True 5 False 6 True Name: value1, dtype: bool ------ 0 1.0 3 2.0 4 3.0 6 4.0 dtype: float64 value1 value2 0 1.0 a 1 NaN b 2 NaN c 4 3.0 e 5 NaN f
删除缺失值 - dropna
s = pd.Series([1,np.nan,np.nan,2,3,np.nan,4])
df = pd.DataFrame({'value1':[1,np.nan,np.nan,2,3,np.nan,4],
'value2':['a','b','c',np.nan,'e','f',np.nan]})
# drop方法:可直接用于Series,Dataframe
# 注意inplace参数,默认False → 生成新的值
s.dropna(inplace = True)
df2 = df['value1'].dropna()
print(s)
print(df2)
0 1.0 3 2.0 4 3.0 6 4.0 dtype: float64 0 1.0 3 2.0 4 3.0 6 4.0 Name: value1, dtype: float64
# 填充/替换缺失数据 - fillna、replace
s = pd.Series([1,np.nan,np.nan,2,3,np.nan,4])
df = pd.DataFrame({'value1':[1,np.nan,np.nan,2,3,np.nan,4],
'value2':['a','b','c',np.nan,'e','f',np.nan]})
# s.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
# value:填充值
# 注意inplace参数
s.fillna(0,inplace = True)
print(s)
print('------')
# method参数:
# pad / ffill → 用之前的数据填充 /向下填充
# backfill / bfill → 用之后的数据填充 /向上填充
df['value1'].fillna(method = 'pad',inplace = True)
print(df)
print('------')
0 1.0 1 0.0 2 0.0 3 2.0 4 3.0 5 0.0 6 4.0 dtype: float64 ------ value1 value2 0 1.0 a 1 1.0 b 2 1.0 c 3 2.0 NaN 4 3.0 e 5 3.0 f 6 4.0 NaN ------
# df.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad', axis=None)
# to_replace → 被替换的值
# value → 替换值
s = pd.Series([1,np.nan,np.nan,2,3,np.nan,4])
s.replace(np.nan,'缺失数据',inplace = True)
print(s)
print('------')
# 多值用np.nan代替
s.replace([1,2,3],np.nan,inplace = True)
print(s)
0 1.0 1 缺失数据 2 缺失数据 3 2.0 4 3.0 5 缺失数据 6 4.0 dtype: object ------ 0 NaN 1 缺失数据 2 缺失数据 3 NaN 4 NaN 5 缺失数据 6 4.0 dtype: object
一起学习的小伙伴如果有什么想法或者意见,欢迎沟通~