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

pandas 遍历数据 删除缺省值和异常值
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
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 """
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录