pandas 遍历数据 删除缺省值和异常值

问题:遍历数据中的所有列,将缺省值和异常值(负数的值)数量超过30%的列删掉
数据一共有8000列 140行
其中要处理的部分数据如图

img

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
"""