以表table_missing为例
导入数据:
import pandas as pd
import numpy as np
df = pd.read_csv('data/table_missing.csv')
df.head()
表如下:
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()
实例练习
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