Pandas数据清洗方法

一.重复值处理:直接删除为主。一般先处理重复行,再处理唯一值列。

以行为单位,查看重复值

df[df.duplicated()]

以行为单位,删除重复值

df.drop_duplicates()

以某列(如ID)为单位,查看重复值

df[df.duplicated(‘ID‘)]

以某列(如ID)为单位,删除重复值

df.drop_duplicated(‘ID‘)

二.缺失值处理:主要根据业务经验填补。

少于20%的连续变量用均值、中位数填补,分类变量用众数填补,也可以不用填补单算一类;

20%-80%填补或者生产指示哑变量;

80%以上,使用指示哑变量,不使用原始变量。

查看缺失比例情况

df.apply(lambda x:sum(x.isnull())/x.size)

以指定值填补(均值、中位数、众数)

df[‘col‘].fillna(df[‘col‘].mean())

df[‘col‘].fillna(df[‘col‘].median())

df[‘col‘].fillna(df[‘col‘].mode()[0])

生产指示哑变量

df[‘col_new‘] = df[‘col‘].isnull().apply(int)

三.离群值处理:离群值会干扰模型结果。单变量用盖帽法、分箱法;多变量用聚类法。

盖帽法:将某连续变量均值上下三倍标准差范围外的记录替换为均值上下三倍标准差;也可以自定义分位数函数。

函数1:

def exclude_extreme(s):# x:pd.Series列,连续变量
mean = s.mean()    sigma = s.std()    ceiling = mean + 3 * sigma    floor = mean - 3 * sigma    s_copy = s.copy()    s_copy[s_copy > ceiling] = ceiling    s_copy[s < s_copy] = floor    return s_copy

函数2:自定义分位数

def cap(x,quantile=[0.01,0.99]):    """    :arg    x:pd.Series列,连续变量    quantile:制定盖帽法的上下分位数范围    """    Q01,Q99 = x.quantile(quantile).values.tolist()    if Q01 > x.min():        x = x.copy()        x.loc[x<Q01] = Q01    if Q99 < x.max():        x.loc[x>Q99] = Q99    return x

分箱法:将离群值包含在箱子中,在进行建模的时候不直接进行到模型中,可以达到处理离群值的目的。

等宽分箱:cut函数,必须输入待分箱的列及分箱个数两个参数,labels可选。下限为列最小值,上限为列最大值,产生一个Cat类的新列,labels可以指定数值或字符串对替代区间值。

pd.cut(df[‘col‘],bins=?,labels=[?,?,?,...])

等深分箱:qcut函数,必须输入待分箱的列及分箱个数两个参数,labels可选。下限为列最小值,上限为列最大值,产生一个Cat类的新列,labels可以指定数值或字符串对替代区间值。

pd.qcut(df[‘col‘],bins=?,labels=[?,?,?,...])

或使用分位数进行分箱,如分为2箱

df[‘col‘].quantile([0,0.5,1])  # 显示最小值,中位值、最大值

pd.cut(df[‘col‘],bins=df[‘col‘].quantile([0,0.5,1]) ,labels=[?,?,?,...],include_lowest=True)  # include_lowest=True 表示包含边界最小值。

相关推荐