问题:遍历数据中的所有列,将缺省值和异常值(负数的值)数量超过30%的列删掉
数据一共有8000列 140行
其中要处理的部分数据如图
import pandas as pd
def clean1(dateframe): # 改进方法一,简单粗暴,使用try和except语句,忽略类型报错,执行绝对正确的步骤
wrong_columns = []
for col in dateframe.columns:
try:
wrong_value = dateframe[col].loc[(dateframe[col] < 0) | (dateframe[col].astype(str) == 'nan')] # 一般来说,NaN转字符串后以'nan'的形式被识别,因此可以利用
rate = wrong_value.shape[0] / dateframe[col].shape[0]
if rate > 0.3:
wrong_columns.append(col)
except:
print('{}列无法进行clean'.format(col)) # 报警信息,按你自己喜欢的形式,可以生成新的df、储存在列表、系统弹窗警告等
return dateframe.drop(columns = wrong_columns) # 不用设置inplace=True,否则会返回None
def clean2(dateframe): # 改进方法二,针对性强,增加一步判断类型,好多方法进行判断,此处参考,没有优化代码性能
wrong_columns = []
for col in dateframe.columns:
date_type = set(dateframe[col])
is_date = [True]
for each in date_type:
check = type(each)
if check is not int and check is not float: # 此处草率的判断是不是int和float,都不是就视为False
is_date[0] = False
break
if is_date[0] is True:
wrong_value = dateframe[col].loc[(dateframe[col] < 0) | (dateframe[col].astype(str) == 'nan')] # 一般来说,NaN转字符串后以'nan'的形式被识别,因此可以利用
rate = wrong_value.shape[0] / dateframe[col].shape[0]
if rate > 0.3:
wrong_columns.append(col)
return dateframe.drop(columns = wrong_columns) # 不用设置inplace=True,否则会返回None
df = pd.DataFrame({'A': [1, 2, None, -1, -3, 1, 2, 3, 4, 5],
'B': [-1, 2, 3, None, 1, 2, 3, 4, 5, 6],
'C': [1, 2, 3, None, 1, 2, 3, 4, 5, 6],
'D': [1, 2, 3, 0, 1, 2, 3, 4, 5, 6],
'E': [1, 2, None, -1, -3, -1, 2, 3, 4, 5],
'F': ['1/1/1', '1/1/1', '1/1/1', '1/1/1', '1/1/1', '1/1/1', '1/1/1', '1/1/1', '1/1/1', '1/1/1']})
result1 = clean1(df)
result2 = clean2(df)
print(result1)
print(result2)
"""
实现效果如下
A B C D E F
0 1.0 -1.0 1.0 1 1.0 1/1/1
1 2.0 2.0 2.0 2 2.0 1/1/1
2 NaN 3.0 3.0 3 NaN 1/1/1
3 -1.0 NaN NaN 0 -1.0 1/1/1
4 -3.0 1.0 1.0 1 -3.0 1/1/1
5 1.0 2.0 2.0 2 -1.0 1/1/1
6 2.0 3.0 3.0 3 2.0 1/1/1
7 3.0 4.0 4.0 4 3.0 1/1/1
8 4.0 5.0 5.0 5 4.0 1/1/1
9 5.0 6.0 6.0 6 5.0 1/1/1
删除异常列后
A B C D F
0 1.0 -1.0 1.0 1 1/1/1
1 2.0 2.0 2.0 2 1/1/1
2 NaN 3.0 3.0 3 1/1/1
3 -1.0 NaN NaN 0 1/1/1
4 -3.0 1.0 1.0 1 1/1/1
5 1.0 2.0 2.0 2 1/1/1
6 2.0 3.0 3.0 3 1/1/1
7 3.0 4.0 4.0 4 1/1/1
8 4.0 5.0 5.0 5 1/1/1
9 5.0 6.0 6.0 6 1/1/1
"""