按照数据缺失机制可分为:
【注意】:Panda读取的数值型数据,缺失数据显示**“NaN”**(not a number)。
主要就是两种方法:
①删除存在缺失值的个案;
②缺失值插补;
【注意】缺失值的插补只能用于客观数据。由于主观数据受人的影响,其所涉及的真实值不能保证。
【思想来源】:以最可能的值来插补缺失值比全部删除不完全样本所产生的信息丢失要少。
【多重插补方法的三个步骤】:
【多重插补方法举例】:
假设一组数据,包括三个变量Y1,Y2,Y3,它们的联合分布为正态分布,将这组数据处理成三组,A组保持原始数据,B组仅缺失Y3,C组缺失Y1和Y2。在多值插补时,对A组将不进行任何处理,对B组产生Y3的一组估计值(作Y3关于Y1,Y2的回归),对C组作产生Y1和Y2的一组成对估计值(作Y1,Y2关于Y3的回归)。
当用多值插补时,对A组将不进行处理,对B、C组将完整的样本随机抽取形成为m组(m为可选择的m组插补值),每组个案数只要能够有效估计参数就可以了。对存在缺失值的属性的分布作出估计,然后基于这m组观测值,对于这m组样本分别产生关于参数的m组估计值,给出相应的预测即,这时采用的估计方法为极大似然法,在计算机中具体的实现算法为期望最大化法(EM)。对B组估计出一组Y3的值,对C将利用 Y1,Y2,Y3它们的联合分布为正态分布这一前提,估计出一组(Y1,Y2)。
上例中假定了Y1,Y2,Y3的联合分布为正态分布。这个假设是人为的,但是已经通过验证(Graham和Schafer于1999),非正态联合分布的变量,在这个假定下仍然可以估计到很接近真实值的结果。
【多重插补弥补贝叶斯估计的不足之处】:
【Pandas读取数据】:
import numpy as np
import pands as pd
#读取一个csv文件,读取其它类型文件,详见Pandas基础
df = pd.read_csv('data/table_missing.csv')
df.head()
#对Series使用isna方法
df['Physics'].isna().head()
#对Series使用notna方法
df['Physics'].notna().head()
#对DataFrame使用isna方法
df.isna().head()
#对DataFrame使用notna方法
df.notna().head()
#求DataFrame每列的缺失值的数量
df.isna().sum()
#通过info函数查看缺失信息
df.info()
#查看缺失值所在行,以最后一列为例,挑出该列缺失值的行
df[df['Physics'].isna()]
#挑选出所有非缺失值的列
df[df.notna().all(1)]
s_original = pd.Series([1,2],dtype="int64")
s_original
'''
输出:
0 1
1 2
dtype:int64
'''
s_new = pd.Series([1,2],dtype="Int64")
s_new
'''
输出:
0 1
1 2
dtype:Int64
'''
好处/优点:
前面提到的三种缺失值(np.na、None、NaT)都会被替换为统一的NA符号,且不改变数据类型。
s_original[1] = np.nan
s_original
'''
output:
0 1.0
1 NaN
dtype:float64
'''
s_new[1] = np.nan
s_new
'''
output:
0 1
1
dtype:Int64
'''
s_new[1] = None
s_new
'''
output:
0 1
1
dtype:Int64
'''
s_new[1] = pd.NaT
s_new
'''
output:
0 1
1
dtype:Int64
'''
s_original = pd.Series([1,0],dtype="bool")
s_original
'''
output:
0 True
1 False
dtype:bool
'''
s_new = pd.Series([1,0],dtype="boolean")
s_new
'''
output:
0 True
1 False
dtype:boolean
'''
s_original[0] = np.nan
s_original
'''
output:
0 NaN
1 0.0
dtype:float64
'''
s_original = pd.Series([1,0],dtype="bool")
s_original[0] = None
s_original
'''
output:
0 False
1 False
dtype:bool
'''
s_new[0] = np.nan
s_new
'''
output:
0
1 True
dtype:boolean
'''
s_new[0] = None
s_new
'''
output:
0
1 True
dtype:boolean
'''
s_new[0] = pd.NaT
s_new
'''
output:
0
1 True
dtype:boolean
'''
s = pd.Series(['dog','cat'])
s[s_new]
'''
output:
1 cat
dtype:object
'''
s = pd.Series(['dog','cat'],dtype='string')
s
'''
output:
0 dog
1 cat
dtype:string
'''
s[0] = np.nan
#s[0] = None
#s[0] = pd.NaT
'''
output:
0
1 cat
dtype:string
'''
【与object类型的区别】:
在调用字符方法后,string类型返回的是Nullable类型,object则会根据缺失类型和数据类型而改变
s = pd.Series(["a",None,"b"],dtype="string")
s.str.count('a')
'''
output:
0 1
1
2 0
dtype:Int64
'''
s2 = pd.Series(["a",None,"b"],dtype="object")
s2.str.count("a")
'''
output:
0 1.0
1 NaN
2 0.0
dtype:float64
'''
s.str.isdigit()
'''
output:
0 False
1
2 False
dtype:boolean
'''
s2.str.isdigit()
'''
output:
0 False
1 None
2 False
dtype:object
'''
pd.NA ** 0
'''
output:1
'''
1 ** pd.NA
'''
output:1
'''
s = pd.Series([2,3,np.nan,4])
s.sum()
'''
output:9.0
'''
s.prod()
'''
output:24.0
'''
s.cumsum()
'''
output:
0 2.0
1 5.0
2 NaN
3 9.0
dtype:float64
'''
s.cumprod()
'''
output:
0 2.0
1 6.0
2 NaN
3 24.0
dtype:float64
'''
s.pct_change()
'''
output:
0 NaN
1 0.500000
2 0.000000
3 24.0
dtype:float64
'''
自动忽略为缺失值的组
df_g = pd.DataFrame({
'one':['A','B','C','D',np.nan],'two':np.random.randon(5)})
df_g
df_g.groupby('one').groups
'''
output:
{'A': Int64Index([0], dtype='int64'),
'B': Int64Index([1], dtype='int64'),
'C': Int64Index([2], dtype='int64'),
'D': Int64Index([3], dtype='int64')}
'''
df['Physics'].fillna('missing').head()
'''
output:
0 A+
1 B+
2 B+
3 missing
4 A-
Name: Physics, dtype: object
'''
df['Physics'].fillna(method='ffill').head()
'''
output:
0 A+
1 B+
2 B+
3 B+
4 A-
Name: Physics, dtype: object
'''
df['Physics'].fillna(method='backfill').head()
'''
output:
0 A+
1 B+
2 B+
3 A-
4 A-
Name: Physics, dtype: object
'''
df_f = pd.DataFrame({
'A':[1,3,np.nan],'B':[2,4,np.nan],'C':[3,5,np.nan]})
df_f.fillna(df_f.mean())
[output]
返回的结果中没有C,根据对齐特点不会被填充
df_f.fillna(df_f.mean()[['A','B']])
df_d = pd.DataFrame({
'A':[np.nan,np.nan,np.nan],'B':[np.nan,3,2],'C':[3,2,1]})
df_d
df_d.dropna(axis=0)
(2)axis=1,删除存在缺失值的列
df_d.dropna(axis=1)
df_d.dropna(axis=1,how='all')
(2)选择any,表示存在缺失去除。当某一行/列(由axis决定)的值至少有一个缺失值的时候,才被删除。
3. subset参数(即在某一组列范围中搜索缺失值)
df_d.dropna(axis=0,subset=['B','C'])
s = pd.Series([1,10,15,-5,-2,np.nan,np.nan,28])
s
'''
output:
0 1.0
1 10.0
2 15.0
3 -5.0
4 -2.0
5 NaN
6 NaN
7 28.0
dtype: float64
'''
s.interpolate()
'''
output:
0 1.0
1 10.0
2 15.0
3 -5.0
4 -2.0
5 8.0
6 18.0
7 28.0
dtype: float64
'''
s.index = np.sort(np.random.randint(50,300,8))
s.interpolate()
'''
值不变
output:
69 1.0
71 10.0
84 15.0
117 -5.0
119 -2.0
171 8.0
219 18.0
236 28.0
dtype: float64
'''
此处的高级指的是与线性插值相比较,例如样条插值、多项式插值、阿基玛插值等。
此处属于数值分析的内容。
s = pd.Series([1,np.nan,np.nan,np.nan,5])
s.interpolate(limit=2)
'''
output:
0 1.0
1 2.0
2 3.0
3 NaN
4 5.0
dtype: float64
'''
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])
s.interpolate(limit_direction='backward')
'''
output:
0 1.0
1 1.0
2 1.0
3 2.0
4 3.0
5 4.0
6 5.0
7 NaN
8 NaN
dtype: float64
'''
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])
s.interpolate(limit_area='inside')
'''
output:
0 NaN
1 NaN
2 1.0
3 2.0
4 3.0
5 4.0
6 5.0
7 NaN
8 NaN
dtype: float64
'''
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])
s.interpolate(limit_area='outside')
'''
0 NaN
1 NaN
2 1.0
3 NaN
4 NaN
5 NaN
6 5.0
7 5.0
8 5.0
dtype: float64
'''