# 07 缺失数据
# 1 缺失值的统计和删除
# 01 统计
# 02 删除
# 2 缺失值的填充和插值
# 01 fillna填充
# 02 插值函数
# 线性插值
# 最邻近插补
# 索引插值
# 3 Nullable类型
# 01 缺失记号
# 02 Nullable类型的性质
# 03 缺失数据的计算和分组
# sum,prod 缺失数据等价于被分别视作0,1
# 使用累计函数时 会跳过缺失值
# diff 凡是参与缺失值计算的都设为缺失值,pct_change 缺失值位置设为0%变化率
# 类别处理缺失值
# 07 缺失数据
import numpy as np
import pandas as pd
# 1 缺失值的统计和删除
# 01 统计
path = r'C:\Users\lenovo\Desktop\最近要用\pandas\joyful-pandas\data'
df = pd.read_csv('{}/learn_pandas.csv'.format(path),usecols=['Grade','Name','Gender','Height','Weight','Transfer'])
df.isna().head()
df.isna().sum()/df.shape[0] # 每列缺失的比例
# 查看缺失行
df[df.Height.isna()].head() # 查看身高缺失的行
sub_set = df[['Height','Weight','Transfer']]
df[sub_set.isna().all(1)] # 查看sub_set全部缺失的行
df[sub_set.isna().any(1)] # 查看sub_set存在确实的行
df[sub_set.notna().all(1)] # 查看sub_set没有缺失的行
# 02 删除
res = df.dropna(how='any',subset=['Height','Weight']) # 删除subset存在缺失值的行
res = df.loc[df[['Height','Weight']].notna().all(1)]
res = df.dropna(1,thresh=df.shape[0]-15) # 删除超过15个缺失值的列
res = df.loc[:,-(df.isna().sum()>15)]
# 2 缺失值的填充和插值
# 01 fillna填充
s = pd.Series([np.nan,1,np.nan,np.nan,2,np.nan],list('aaabcd'))
s.fillna(method='ffill') # ffill用前面的填充 bfill用后面的填充
s.fillna(method='ffill',limit=1) # 连续出现的缺失 最多填充1次
s.fillna(s.mean())
s.fillna({'a':100,'d':200})
df.groupby('Grade')['Height'].transform(lambda x:x.fillna(x.mean())).head()
# 02 插值函数
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,2,np.nan,np.nan])
s.values
# 线性插值
res = s.interpolate(limit_direction='backward',limit=1) # backward向后限制插值,forward向前,限制最大连续条数为1
res = s.interpolate(limit_direction='both',limit=1) # 双向限制插值
# 最邻近插补
s.interpolate('nearest').values
# 索引插值
s = pd.Series([0,np.nan,10],index=[0,1,10])
s.interpolate() # 默认线性插值
s.interpolate(method='index')
s = pd.Series([0,np.nan,10],index=pd.to_datetime(['20200101','20200102','20200111']))
s.interpolate()
s.interpolate(method='index')
# 3 Nullable类型
# 01 缺失记号
# python中缺失值用None表示,除等于自己本身外,与其他任何元素都不相等
# numpy中用np.nan表示,和自身比较结果返回False,与其他任何元素都不相等
# 比较操作时,np.nan位置返回False,equals进行表/序列相同性检验时,会自动跳过两侧表都是缺失的位置
# 02 Nullable类型的性质
dff = pd.read_csv('{}/learn_pandas.csv'.format(path))
dff.info()
dff = dff.convert_dtypes()
dff.info()
# 03 缺失数据的计算和分组
# sum,prod 缺失数据等价于被分别视作0,1
s = pd.Series([2,3,np.nan,4,5])
s.sum()
s.prod() # 乘法
# 使用累计函数时 会跳过缺失值
s.cumsum()
# diff 凡是参与缺失值计算的都设为缺失值,pct_change 缺失值位置设为0%变化率
s.diff()
s.pct_change()
# 类别处理缺失值
df_nan =pd.DataFrame({'category':['a','a','b',np.nan,np.nan],'value':[1,3,5,7,9]})
df_nan.groupby('category',dropna=False)['value'].mean()
pd.get_dummies(df_nan.category,dummy_na=True)