07 pandas 缺失数据

# 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)















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值