一、重复值
1、重复值判断
od.duplicated( subset: Union[Hashable, Sequence[Hashable], NoneType] = None, #判断依据列,列表传入 keep: Union[str, bool] = ‘first‘, #判断模式first/last/False ) -> ‘Series‘
2、重复值删除
od.drop_duplicates( subset: Union[Hashable, Sequence[Hashable], NoneType] = None, #删除依据列,列表传入 keep: Union[str, bool] = ‘first‘, #first保留首行,last保留尾行,False不保留 inplace: bool = False, #是否更改原对象 ignore_index: bool = False, #是否重置索引 ) -> Union[ForwardRef(‘DataFrame‘), NoneType]
二、缺失值
1、缺失值判断:isnull/notnull, 返回bool值;
2、插入缺失值:可以使用 None
等方法将内容修改为缺失值:
s.loc[0] = None s.loc[1] = np.nan df.two = pd.NA
3、缺失值处理:
dropna: 丢弃,删除缺失值
axis: 删除行还是列,{0 ro ‘index‘, 1 or ‘columns‘}, default 0
how: 如果等于any则任何值为空都删除,如果等于all则所有值都为空时才删除
inplace: 如果为True则修改当前df, 否则返回新的df
fillna: 填充空值
value: 用于填充的值,可以是单个值,或者字典(key是列名,value是值)
method: 等于ffill使用前一个部位空的值填充forword fill; 等于bfill使用后一个部位空的值天充backword fill,也可使用线性或分步等插值方法
axis: 按行还是按列填充,{0 ro ‘index‘, 1 or ‘columns‘}
inplace: 如果为True则修改当前df, 否则返回新的df
三、异常值
1、异常值判断:
①均值-标准差判断:例均值上下三个标准差以内为正常值
#均值—标准差检测:均值加减3个标准差为正常范围 xbar = od[‘重量‘].mean() #均值 xstd = od[‘重量‘].std() #标准差 ub = xbar + 3*xstd lb = xbar - 3*xstd print(‘均值:%.2f 标准差:%.2f 上界:%.2f 下界:%.2f‘%(xbar,xstd,ub,lb)) if any(od[‘重量‘]>ub)==True: print(‘上界以上出现异常值‘) if any(od[‘重量‘]<lb)==True: print(‘下界以下出现异常值‘) else: print(‘均值-标准差检测:无异常‘)
均值:12.05 标准差:59.01 上界:189.07 下界:-164.97 上界以上出现异常值
②箱线法:例四分位数上下1.5个分位差为正常值
#箱线法检测:上四分位数加1.5个分位差以上,及下四分位数减1.5分位差以下为异常值 Q1 = od[‘重量‘].quantile(q=0.25) #下四分位数 Q3 = od[‘重量‘].quantile(q=0.75) #上四分位数 IQR = Q3 - Q1 #分位差 ub = Q3 + 1.5*IQR #上界 Lb = Q1 - 1.5*IQR #下界 print(‘下四分位数:%.2f 上四分位数:%.2f 上界:%.2f 下界:%.2f‘%(Q1,Q3,ub,lb)) if any(od[‘重量‘]>ub)==True: print(‘上界以上出现异常值‘) if any(od[‘重量‘]<lb)==True: print(‘下界以下出现异常值‘) else: print(‘箱线法检测:无异常‘)
下四分位数:0.60 上四分位数:5.80 上界:13.60 下界:-164.97 上界以上出现异常值
2、异常值处理
①根据实际情况
②填充最接近上下界的数据;
③超出百分之一分位数与百分之九十九分位数的,填充为这两个分位数
四、数据离散化【分箱/分段/分级】
1、等宽分段:按照数据范围分为几层,如0-1、1-2、2-3,数据范围相等,落到各段的数据个数相差可能巨大
#等宽分箱 分四份 od[‘等宽分箱‘] = pd.cut(od[‘去异常重量‘],4,labels=range(1,5)) od.loc[:,[‘包裹号‘,‘去异常重量‘,‘等宽分箱‘]].sort_values([‘去异常重量‘],ascending=False) od[‘等宽分箱‘].value_counts() 1 5449 2 165 4 95 3 63 Name: 等宽分箱, dtype: int64
2、等频分段:按照数据点分布频率划分数据范围,各段包含的数据点基本一致
#等频分箱 k=4 pd.qcut(od[‘去异常重量‘],q=[i/k for i in range(k+1)],labels=range(1,k+1)).value_counts() 2 1523 1 1487 4 1419 3 1343 Name: 去异常重量, dtype: int64
3、cut—qcut
pd.cut( x, #输入待cut的一维数组 bins, #cut的段数,一般为整型,但也可以为序列向量(若不在该序列中,则是NaN) right: bool = True, #布尔值,确定右区间是否开闭,取True时右区间闭合 labels=None, #数组或布尔值,用来标识分后的bins,长度必须与结果bins相等,各个级别的名称 retbins: bool = False, #布尔值,可选。是否返回数值所在分组,Ture则返回 precision: int = 3, #整型,bins小数精度,也就是数据以几位小数显示 include_lowest: bool = False, duplicates: str = ‘raise‘, )
pd.qcut( x, #待cut的一维数组 q, #段数 labels=None, #各级别名称 retbins: bool = False, precision: int = 3, duplicates: str = ‘raise‘, )
原文:https://www.cnblogs.com/5947l/p/14309471.html