做数据分析之前,数据清洗总是避免不了的,耗时费劲,且无实际产出及对个人能力提升,理论上应该尽量把数据清洗时间压缩到最低。程序的角度是用更优的算法,更优的工具。运营的角度是用规范的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()
持续更新