缺失数据处理

缺失数据处理的三种方法

以表table_missing为例
导入数据:

import pandas as pd
import numpy as np
df = pd.read_csv('data/table_missing.csv')
df.head()

表如下:
缺失数据处理_第1张图片
1. 方法一:填充,fillna方法
(a)值填充与前后向填充

df['Physics'].fillna('missing').head()##值填充
df['Physics'].fillna(method='ffill').head()##向前填充
df['Physics'].fillna(method='backfill').head() ##向后填充

(b)填充中的对齐特性

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())  ##最后一行填充均值

2.方法二:剔除,dropna方法
(a) 按行、列剔除

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)##按行剔除
df_d.dropna(axis=1) ##按列剔除

(b)剔除全部缺失和存在缺失,how参数
all为全部缺失,any为存在缺失

df_d.dropna(axis=1,how='all')

(c)在某一范围内搜索缺失值,subset参数

df_d.dropna(axis=0,subset=['B','C'])

综合(a)(b)(c)可实现数据过滤:

dropna(axis=0,how='any',thresh=None,subset=None,inplace=False)

3. 方法三:插值
(a) 线性插值
默认状态下,interpolate会对缺失的值进行线性插值

s = pd.Series([1,10,15,-5,-2,np.nan,np.nan,28])
s.interpolate()

(b)高级插值方法

ser = pd.Series(np.arange(1, 10.1, .25) ** 2 + np.random.randn(37))
missing = np.array([4, 13, 14, 15, 16, 17, 18, 20, 29])
ser[missing] = np.nan
methods = ['linear', 'quadratic', 'cubic']
df = pd.DataFrame({m: ser.interpolate(method=m) for m in methods})
df.plot()

缺失数据处理_第2张图片
实例练习
1.如何删除缺失值超过25%的列
2.以列类型分别为string/浮点/整型读入数据,并选出列C为缺失值的行
3.统计各列缺失的比例并选出在后三列中至少有两个非缺失值的行
解答

###第一题方法一:
import pandas as pd
import numpy as np
df = pd.read_csv('data/table_missing.csv')
df.drop(df.columns[df.isna().sum()/len(df)>0.25],axis=1)
###第一题方法二:
df.dropna(thresh=len(df)*(1-0.25),axis=1)
###通过thresh设置行或列中非缺失值的最少数量
###第二题:
df = pd.read_csv('data/Missing_data_one.csv').convert_dtypes()
df[df['C'].isna()]
##第三题:
df = pd.read_csv('data/Missing_data_two.csv')
df.isna().sum()/len(df)
df_1=df[df.iloc[:,-3:].isna().sum(1)<=1]
df_1

你可能感兴趣的:(缺失数据处理)