python基础之数据清洗

一、重复值

  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',
)

 

posted @ 2021-01-27 13:45  5947  阅读(221)  评论(0)    收藏  举报