pandas 学习笔记10 数据清洗

1 缺失值的认定

df = pd.DataFrame({
    'A':['a1','a1','a2','a2'],
    'B':['b1','b2',None,'b2'],
    'C':[1,2,3,4],
    'D':[5,6,None,8],
    'E':[5,None,7,8]
})
pd.options.mode.use_inf_as_na=True#将无穷值设为缺失值

#缺失值判断 df.isna() df.isnull()为主要方法
df.isna() #检测缺失值
df.D.isna() #检测一列
df.notna() #将缺失值显示为false
#布尔值求和
pd.Series([True,False,True]).sum() #false=0,True=1
df.isna().sum() #每列缺失值情况
df.isnull().sum(1) #每行缺失值情况
df.isna().sum().sum() #总共有多少个缺失值

df.loc[df.isna().any(1)] #有缺失值的行
df.loc[:,df.isna().any()] #有缺失值的列
#取反
df.loc[~df.isna().any(1)]
df.loc[:,~df.isna().any()]
#通用标量NA,NaT表示时间数据中的缺失值,NaN
s = pd.Series([1,2,None,4],dtype='Int64')
pd.isna(pd.NA)

#修改缺失值
df.loc[0] =None
df.loc[1]=None
df.A=pd.NA

2.缺失值操作

#缺失值操作
df.fillna(0) #将缺失值填充为0
#填充为指定字符
df.fillna('missing')
df.fillna('暂无')
df.A.fillna('暂无') #指定字段填充
df.A.fillna('missing',limit=1)#只替换一个
#将不同的列替换成不同的值
values={'A':0,'B':1,'C':2,'D':3}
df.fillna(value=values)
df.fillna(method='bfill') #取后一个填充
df.fillna(method='ffill')#取前一个填充
df.fillna(df.mean()) #填充列的平均值
s = pd.Series([0,1,np.nan,3])
s.interpolate()#插值填充,默认为linear 线性
df.dropna()#删除所有缺失值的行
df.dropna(1) #删除所有缺失值的列
df.dropna(thresh=2) #删除至少有两个缺失值的行
# df.dropna(subset=['name','born']) #指定判断缺失值的列范围
#缺失值参与计算
df.sum() #对所有列求和
df.D.cumsum() #累加 cumsum和cumprod会忽略NA值,但NA值会保留在序列中
df.D.cumsum(skipna=False) #跳过空行
df.count()#缺失值不计数
df.groupby('B').sum() #聚合时,空值忽略
df.groupby('B',dropna=False).sum() #聚合计入缺失值

3 数据替换

#替换缺失值
ser = pd.Series([0.,1.,2.,3.,4.])
ser.replace(0,5) #将0换成5
ser.replace([0,1,2,3,4],[4,3,2,1,0]) #按映射一一映射
ser.replace({0:10,1:100}) #利用字典映射替换对应值
ser.replace([1,2,3],method='pad') #ffill是同义词
df.replace(to_replace='bat',value='new') #把bat替换成new
df.replace(to_replace=r'^ba.$',value='new',regex=True)#利用正则表达式将ba开头的替换成new
df.replace({'A':r'^ba.$'},{'A':'new'},regex=True) #多列规则不一的传入方法

#缺失值替换
d={
    'a':list(range(4)),
    'b':list('ab..'),
    'c':['a','b',np.nan,'d']
}
df = pd.DataFrame(d)
df.replace('.',np.nan) #将无效值替换成nan在处理
df.replace(r'\s*.\s*',np.nan,regex=True) #利用正则将空格等替换成nan

#数字替换
df = pd.DataFrame(np.random.randn(10,2))
df[np.random.rand(df.shape[0])>0.5]=1.5
df.replace(1.5,np.nan)
df.replace([1.5,df.iloc[0,0]],[np.nan,'a']) #将1.5换成nan,同时,左上角的值换成a
#数据修改
df = pd.DataFrame({'a':[-1,2,5],'b':[6,1,-3]})
df.clip(0,3) #修剪成最大为3,最小为0
#按列指定下限和上线阈值进行修剪,如下列中数据按同索引位c值和c对应值+1进行修剪
c = pd.Series([-1,1,3])
df.clip(c,c+1,axis=0)

4 重复值及删除数据

#重复值及删除数据
#df.duplicated(subset=None,keep='first') #检查重复值语法,first-第一个标注为True,last-最后一个标准为True,False 将所有标注为True
df = pd.DataFrame({
    'A':list('xxz'),
    'B':list('xxx'),
    'C':[1,1,2]
})
df.duplicated() #全行检测,除第一次出现外,重复的为True
df.duplicated(keep='last') #除最后一次出现的外,重复的为True
df.duplicated(keep=False) #所有重复的都为True
df.duplicated(subset=['B'],keep=False) #指定检测列
df[df.duplicated()] #筛选出重复内容
#删除重复值
# df.drop_duplicates(
#     self,
#     subset: Hashable | Sequence[Hashable] | None = None,#指定的标签或标签序列,仅删除这些列重复值,默认情况下为所有列
#     keep: Literal["first"] | Literal["last"] | Literal[False] = "first",#确定要保留的重复值 first last False(所有)
#     inplace: bool = False,#是否生效
#     ignore_index: bool = False,#如果为True,重新生成自然索引
# )

df.drop_duplicates()#删除重复行
df.drop_duplicates(subset=['A']) #删除指定列
df.drop_duplicates(subset=['A'],keep='last') #保留最后一个

#删除数据
# df.drop(
#     self,
#     labels=None,#要删除的行和列,如果要删除多个,传入列表
#     axis: Axis = 0,#轴的方向,0为行,1为列,默认为0
#     index=None,#指定一行或多行
#     columns=None,#指定一列或多列
#     level: Level | None = None,#索引层级,将删除此层级
#     inplace: bool = False,#是否生效
#     errors: str = "raise",#ignore或raise,如果为ignore,则容忍错误,仅删除现有标签
# )
df.drop([0,1]) #删除指定行
df.drop(['B','C'],axis=1) #删除指定列

5 numpy格式转换

df = pd.read_excel(r'D:\pythonproject\pythonVsc\pandas\data\team.xlsx')
# numpy格式转换
#转换方法 ds.to_numpy() s.array
#df 转为ndaaray
df.values #不推荐
df.to_numpy()
df[['name','Q1']].to_numpy() #转换指定列
df.Q1.values #不推荐
df.Q1.to_numpy()
df.Q1.array #同上
#df.to_records()
df.to_records() #转换成np record array
np.array(df.to_records()) #转为array
np.array(df) #df转array
np.array(df.to_records().view(type=np.matrix)) #转为矩阵

# 其他资源
https://www.gairuo.com/p/numpy-tutorial

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值