学习记录642@python 数据预处理场景之删除缺失值较多的变量、删除唯一值变量、删除分布不均变量

以下操作包括:

  • 删除缺失值较多的变量,给定缺失率阈值为90%
  • 删除唯一值变量,变量值唯一
  • 删除其他无用变量,分布异常不均衡,数据源中变量的某一个取值占所有样本量的90%,则删除该变量
import pandas as pd
import numpy as np
import time,datetime
df = pd.DataFrame([['张三',23,'男',100,],['李四1',27,'女', np.NaN],['李四2',27,'女', np.NaN],['李四3',27,'女', np.NaN],['李四4',27,'女', np.NaN],['李四5',27,'女', np.NaN],['李四6',27,'女', np.NaN],['李四7',27,'女', np.NaN],['李四8',27,'女', np.NaN],['李四9',27,'女', np.NaN],['王二',26,'不男不女', np.NaN]],columns=['姓名','年龄','性别','收入'])

# 删除缺失值率大于0.9的列
def del_na(df,colname_1,rate):
    ##df: dataframe
    ##colname_1: 列名list
    ##rate:缺失值比例,删除大于rate的变量
    # na_cols 返回的是一个序列,索引是列名,值为这一列缺失值的个数与行数的比例
    na_cols= df[colname_1].isna().sum().sort_values(ascending=False) / float(df.shape[0])
    na_del = na_cols[na_cols >= rate]
    df = df.drop(na_del.index, axis=1)
    return df,na_del

print(df)
df1,na_del=del_na(df,df.columns,0.9)
print(df1)
print(na_del)

# 剔除唯一值的变量
# 先加一列数据,其中两个null,其他的都是’唯一‘
df['唯一']=[np.NaN]*2 + ['唯一'] * (df.shape[0]-2)
print(df)

# 剔除唯一值的变量 的函数
def constant_del(df, cols):
    dele_list = []
    for col in cols:
        # remove repeat value counts
        uniq_vals = list(df[col].unique())
        if pd.isnull(uniq_vals).any(): # 判断是否存在null值
            if len( uniq_vals ) == 2:
                dele_list.append(col)
                print (" {} 变量只有一种取值,该变量被删除".format(col))
        elif len(df[col].unique()) == 1:
            dele_list.append(col)
            print (" {} 变量只有一种取值,该变量被删除".format(col))
    df = df.drop(dele_list, axis=1)
    return df,dele_list


df2,dele_list = constant_del(df, df.columns)
print(df2)
print(dele_list)

# 删除其他无用变量,分布异常不均衡
# 数据源中变量的某一个取值占所有样本量的90%,则删除该变量。
def tail_del(df,cols,rate):
    dele_list = []
    len_1 = df.shape[0]
    for col in cols:
        if len(df[col].unique()) < 5: #是否只有五种以下的取值
            # 是否某个取值超比例超过限定rate
            # df[col].value_counts() 返回一个序列,索引是这一列的某个值,值为出现的次数,max取最大的值
            if df[col].value_counts().max()/len_1 >= rate:
                dele_list.append(col)
                print (" {} 变量分布不均衡,该变量被删除".format(col))
    df = df.drop(dele_list, axis=1)
    return df,dele_list
# 此数据中没有可以剔除的列
df3,dele_list = tail_del(df,df.columns,rate=0.9)

print(df3)
print(dele_list)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值