| 原因 | 1)对数据的理解有误,字段含义与理解含义不同 2)指标的统计逻辑差异 3)数据不完整、有缺失或遗漏 |
| 影响 | 数据失真,在分析、建模的过程中会让模型出现错误结果,导致输出值不可靠 识别方法 |
| 识别方法 | 1)分析结果与已知的准确数据进行对比 2)相关人员进行核实(业务数据) |
| 解决方案 | 不断修正逻辑直到获取准确数据 |
| 原因 | 1)数据录入时重复录入 2)数据处理时产生了多条数据 |
| 影响 | 数据失真,在分析、建模的过程中会让模型出现错误结果,导致输出值不可靠 识别方法 |
| 识别方法 | 确定记录的数据主键,统计主键的出现次数 |
| 解决方案 | 1)如两条记录仅某个字段相同,则确定哪一条数据是准确的,删除无效数据 2)如两条完全相同,则删除其中一条 |
案例应用
#数据来源:阿里天池竞赛 #判断DF的列是否存在重复值 DF[列名].is_unique data['user_id'].is_unique #False (即存在重复值) #获得列的唯一值 DF[列名].unique() data['user_id'].unique() #查看重复记录的条数 len(DF[列名])-len(DF[列名].unique()) len(data['user_id'])-len(data['user_id'].unique())
去重处理
'''
DF.drop_duplicates(subset=None,keep='first',inplace=False)
subset:作为主键的列名,默认是按照所有的维度来判断是否重复
keep:保留唯一值的方法,默认保留第一条
first保留第一条
last保留最后一条
False删除所有重复值
inplace:是否修改原数据'''
df=pd.DataFrame({'a':['a','b','c','d','a'],'b':['aa','bb','cc','dd','aa']})
df.drop_duplicates(subset=None,keep='first',inplace=False)
数据缺失值的识别和处理
| 原因 | 1)部分信息被遗漏 2)属性值不存在 3)数据处理时处理错误 |
| 影响 | 数据失真,在分析、建模的过程中会让模型出现错误结果,导致输出值不可靠 识别方法,且有可能丢失大量有用信息 解决方案 |
| 解决方案 | 1)进行数据的重新收集 2)缺失数量较少且缺失字段很重要时,可以直接删除有缺失值的记录。缺失数量较多时,该属性不可用 3)通过补差法补入 |
'''
查看列是否存在缺失值:
查看某一列(Series)缺失值的数量:df[列名].isnull().sum()
查看整个数据集各列的缺失值数量:df.isnull().sum()'''
data['item_id'].isnull().sum()
data.isnull().sum()
'''
user_id 0
item_id 0
behavior_type 0
user_geohash 718581
item_category 0
time 0
date 0
dtype: int64'''
'''
获取存在的缺失值数据:
按条件筛选:df[df[列名].isnull()]'''
data[data['user_geohash'].isnull()]
缺失值的处理
'''
删除缺失值:
df.drop(axis=0,how='any',subset=None,inplace=False)
axis:默认为0即按照横向处理,当某一条出现NaN时删除该行
取值为1即按照轴向处理,...删除该列
how:默认为'any',只要存在一个NaN即删除该行/列
取值为'all',所有的值均为NaN才删除该行/列
subset:需要进行空值判断的列名,如subset=['列名1','列名2']
inplace:在原数据进行修改,默认False为否
如果直接删除整列:del(data['列名'])
填充缺失值:
df.fillna(value=None,method=None,axis=0,inplace=False)
value:替换NaN的值
method参数的取值:{'pad','ffill','backfill','bfill',None},default None
pad/ffill 用前一个非缺失值去填充该缺失值
backfill/bfill 用下一个非缺失值去填充该缺失值
None 默认,指定一个值替换缺失值,当用常数填充时选择为默认'''
数据异常值的识别和处理
| 解决方案 | 1)删除:由于录入错误、采集错误导致的少量异常值可直接删除(谨慎) 2)视为缺失值:进行填充等处理 3)保留异常 |
''' 查看是否存在异常值 df.boxplot(column=None,fontsize=None,rot,grid=True,by=None) column:需要绘制箱型图的列名,默认为展示全部数字型列的箱型图 fontsize:横坐标字体大小 rot:横坐标字体的旋转角度 grid:背景网格,默认为展示 by:分组绘图的列名,设置后按照by的条件分别绘制箱型图 注:boxplot函数只适用于DataFrame类型的数据''' #绘图结果直接展示 %matplotlib inline data.boxplot(column=['quality'])
获取异常值
import numpy as np
'''
分位点获取
np.percentile(a,q,interpolation='linear')
a:需要进行计算的列名
q:取分位点的百分比,0-100的数字。当序列有n个数字,25则表示数字由低到高排序的n*0.25位置的述职
interpolation:当n*q的结果不是整数时,分位数的取值逻辑
当得到的分位位置介于值i到j之间时
linear 分位数=i+(j-i)*q
lower 取两个之中较小的值,即i
higher 取两个之中较大的值,即j
nearest 取位置更接近n*q的值
midpoint 取两个值的均值,即(i+j)/2
箱型图异常值的获取
1) 计算上四分位点:Qu=np.percentile(a,q,75,interpolation='midpoint')
2) 计算下四分位点:Ql=np.percentile(a,q,25,interpolation='midpoint')
3) 计算上界:U=Qu+1.5(Qu-Ql)
4) 计算下界:U=Ql-1.5(Qu-Ql)
5) 按照条件筛选异常:df[df>U | df
其他数据处理示例
# 对日期TRANSACTION_DT列进行处理
c_itcont['TRANSACTION_DT'] = c_itcont['TRANSACTION_DT'] .astype(str)
# 将日期格式改为年月日 7242020
c_itcont['TRANSACTION_DT'] = [i[3:7]+i[0]+i[1:3] for i in c_itcont['TRANSACTION_DT'] ]
# 计算每个党派的所获得的捐款总额,然后排序,取前十位
c_itcont.groupby("CAND_PTY_AFFILIATION").sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)
# 计算每个总统候选人所获得的捐款总额,然后排序,取前十位
c_itcont.groupby("CAND_NAME").sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)
# 查看不同职业的人捐款的总额,然后排序,取前十位
c_itcont.groupby('OCCUPATION').sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)
# 查看每个职业捐款人的数量
c_itcont['OCCUPATION'].value_counts().head(10)
# 每个州获捐款的总额,然后排序,取前五位
c_itcont.groupby('STATE').sum().sort_values("TRANSACTION_AMT",ascending=False).head(5)
# 查看每个州捐款人的数量
c_itcont['STATE'].value_counts().head(5)



