weixin_46823718 2022-05-08 15:53 采纳率: 100%
浏览 169
已结题

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

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

img

  • 写回答

1条回答 默认 最新

  • ENGineer_zlshuo 2022-05-09 16:57
    关注
    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
    """
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月27日
  • 已采纳回答 5月19日
  • 创建了问题 5月8日

悬赏问题

  • ¥15 yolov8边框坐标
  • ¥15 matlab中使用gurobi时报错
  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真