以下操作包括:
- 删除缺失值较多的变量,给定缺失率阈值为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)