import re
import pandas as pd
import numpy as np
def savedata(df, name):
if df is None or df.empty:
pass
else:
# na = name.replace('.*??≥?','')
na = re.sub(r'[\\\/\:\*\?\"\<\>\|\.]', "", name)
df.to_csv('./errs/' + na + '.csv', encoding='utf-8', index=None)
# 把需要是数字类型的数据,进行数据上的统一,非数字类型的统一处理成NaN
输入必须是数字 = ['id','age','score1','score2','score_tot']
def 数字类型转换(df):
for name in 输入必须是数字:
# 过滤(字段i 的值--必须是str类型 )的行---> 属于异常的数据,单独存储为xx.csv
bool = df[name].apply(lambda x: isinstance(x, str))
if 1 in bool.values:
savedata(df[name], '【数字类型数据_存在其他字符】' + name + '')
# 重新赋值 (转数字类型后,覆盖原值)
df[name] = pd.to_numeric(df[name], errors='coerce')
# 年龄必须是int, 替换非法值为0
if name == 'age':
df[name]= df[name].fillna(0).astype(int)
return df
状态字段 = ['isdelete']
正常状态值 = [True,'true' ,False, 'false']
def 异常状态过滤(df):
# (~ 取反)
for name in 状态字段:
# df[name].apply( lambda x: isinstance(x, str))
bool1 = ~ df[name].isin(正常状态值)
if 1 in bool1.values:
savedata(df[name], '【状态异常】' + name)
年龄字段 = ['age']
def 异常年龄限制(df):
for i in 年龄字段:
# 存储异常数据
bool = (df[i] > 100)
if 1 in bool:
savedata(df[i], '【年龄异常】' + i)
数据完整性 = [
['score_tot', ['score1', 'score2']]
]
def 数据完整性判断(df):
for arr in 数据完整性:
df_items = df[arr[1]].astype('float')
df_items_sum = df_items.sum(axis=1)
sum_d_count = df[arr[0]].astype('float') / (df_items_sum)
# 忽略掉空值情况 ~s.isin([np.nan, np.inf, -np.inf])
# 判断是否是数字
is_num = ~sum_d_count.isin([np.nan, np.inf, -np.inf])
# 是有效数字 & 分子/分母 !=1,保存异常数据
bool = is_num & (sum_d_count != 1)
if 1 in bool:
list = arr[1]
list.append(arr[0])
list.append('name')
item_name = arr[1][0].replace('.', '')
savedata(df[bool][list], '【数据完整性异常】' + arr[0] + '和' + item_name + '等')
# id,name,age,isdelete,score1,score2,score_tot
# 1,张三,23,a,60,80,140
# 2,lisi,131,false,70,80,140
# 3,aaa,a2,true,90,80,140
# 4,dage,36,false,70,80,150
df_data=pd.read_csv("D:/software/cmder/a.csv")
df=数字类型转换(df_data)
异常状态过滤(df)
异常年龄限制(df)
数据完整性判断(df)
还没有评论,来说两句吧...