pandas的数据清洗

做数据分析之前,数据清洗总是避免不了的,耗时费劲,且无实际产出及对个人能力提升,理论上应该尽量把数据清洗时间压缩到最低。程序的角度是用更优的算法,更优的工具。运营的角度是用规范的SOP,所以记录下来清洗的基本方法是必要的。这里会涉及到比较杂的内容。

  • 检查数据
  • 重复值处理:
  • 缺失值处理:
  • 异常值处理:
  • 字段处理:
    • 类型转化
    • 计算字段
    • 内容处理
  • 列名处理
  • 数据标准化

 查看数据:

df.info()  #查看数据信息,一把看数据类型和
df.isnull().sum()  #判断空值情况
df.notnull().sum()  #判断非空值情况
df.duplicated(subset=None, keep='first') #指定一列的重复情况判断,一般用唯一列
df.describe(percentiles=None, include=None, exclude=None) #数据的描述性统计
df.head(n=5)  #查看前5条数据,对应还有一个df.tail() 查看后5个数据

每个发光法

重复值处理:

重复值判断

df.duplicated(['A','B']).sum()  #duplicated()返回判断结果布尔值,通过sum计算总重复行数
df.nunique()   #统计每一列唯一值个数

重复值处理:

#删除重复值
-------------------------------------------------------------------------------
df.drop_duplicates(subset=None, keep='first', inplace=False) #subset指定行;keep指定保留的位置

缺失值处理

缺失值查看判断 

#na值缺失判断
-------------------------------------------------------------------------------
df.isnull().sum()   #查看每一列数据缺失的情况

缺失值处理

#对缺失值进行填充
--------------------------------------------------------------------------
df.fillna(value=None,method=None,axis=None,inplace=False,limit=None,downcast=None,**kwargs,)
# method参数:
# pad / ffill → 用之前的数据填充 ,临近值插补
# backfill / bfill → 用之后的数据填充 ,临近值插补

# 几种思路:均值/中位数/众数插补、临近值插补、插值法
--------------------------------------------------
df.fillna()   #默认填充一个0,可以任意替换其他数据
df['A'].fillna(df['A'].mean())   #通过平均值进行填充
df['A'].fillna(df['A'].median())   #通过中位数进行填充
df['A'].fillna(df['A'].mode())   #通过平众数进行填充
df['A'].fillna(method = 'ffill',inplace = True)   #向下填充
df['A'].fillna(method = 'bffill',inplace = True)   #向上填充


#对缺失值进行抛弃
---------------------------------------------------------------------------
df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)  
#how表示方式,any是只要有就删除,all是全是才删除;
#subset 表示指定行出现缺失值
#thresh 表示在一行中有多少非空值的数据是可以保留下来的
#inplace 默认是False,默认不替换原数据,fillna同理


异常值处理

# 异常值分析 → 3σ原则 / 箱型图分析
# 异常值处理方法 → 删除 / 修正填补

(1)3σ原则:如果数据服从正态分布,异常值被定义为一组测定值中与平均值的偏差超过3倍的值 → p(|x - μ|) > 3σ
-----------------------------------------------
df['A'] = (df['A']- df['A'].min()) /df['A'].std()>3

(2)箱型图分析
箱型图看数据分布情况,以内限为界


字段处理

#字段内容替换
-------------------------------------------------------------------------------
Series.str.replace(self, pat, repl, n=- 1, case=None, flags=0, regex=True)[source] 
#replace方法完成,多个值可用写入list
df['A'].str.replace('A','B')

#计算字段新增
-------------------------------------------------------------------------------
df['A'] = df['B'] + df['C']  #直接赋值新增

#字段空值处理
-------------------------------------------------------------------------------
df['A'].str.strip()  #对应还有lstrip,rstrip等方法

#数据类型转换
-------------------------------------------------------------------------------
df.astype(dtype, copy=True, errors='raise', **kwargs)  #astype方法转换,非常常用
pd.read_csv(path, dtype={'A': int})  #读取数据的时候转换

#数据切分
-------------------------------------------------------------------------------
Series.str.split(self, pat=None, n=- 1, expand=False)[source]  #expand决定是否拓展
df['A'].str.split('a').str[0]  #切割后获取每行切割结果的第一个值
df['A'].str.split('a').[0]     #切割后获取第一个值

#时间数据转换为日期数据
-------------------------------------------------------------------------------
pd.to_datetime(df['购买日期'],format = '%Y%m%d')

#日期数据去掉单位(作图时常用)
-------------------------------------------------------------------------------
pd.to_datetime(df['购买日期'],format = '%Y%m%d')
df['购买日期']/np.timedelta64(1, 'D')

 

列名处理

#列名替换
-------------------------------------------------------------------------------
df.rename(mapper=None,index=None,columns=None,axis=None,copy=True,inplace=False,level=None,)
df.rename(columns = {'AA':'AB','BB':'BA'})
df.columns = ['A','B','C','D','E','F','G']

#列名空值处理
-------------------------------------------------------------------------------
df.columns.str.strip() 

#列名缺失
-------------------------------------------------------------------------------
pd.read_csv(path, names = column_names)  #column_names是一个list
df.columns = ['A','B','C','D','E','F','G']  #直接覆盖命名,会覆盖一行

#多级列索引
-------------------------------------------------------------------------------
df.columns.droplevel(level=0)  #删除掉第一层索引
 

数据标准化处理

  • 0-1标准化:
  • Z-score标准化
# 0-1标准化
# x = (x - Min) / (Max - Min)
df['A'] = (df['A']- df['A'].min()) /(df['A'].max() - df['A'].min())

# Z-score标准化
# z=(x-μ)/σ,其中x为某一具体分数,μ为平均数
df['A'] = (df['A']- df['A'].mean()) /df['A'].std()

持续更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值