numpy-数据清洗
阅读原文时间:2023年07月16日阅读:1

一、对G列数据进行清洗,根据['无','2000-3999','4000-5999','6000-7999','8000-9999','>10000']进行划分

去处重复值

# 删除重复值

print('删除重复值前大小',data.shape)

# 删除记录

data = data.drop_duplicates()

print('删除重复值后大小',data.shape)

删除缺失值

"""删除缺失值"""
#df.dropna()# 删除出现缺失值得行

df.dropna(axis=1)

#df.dropna(how='any') # 只要出现缺失值就删除
#df.dropna(subset=['房价'])# 指定列出现缺失值才删除

#data.dropna(how='all') # 当整行数据都为nan 时才删除

删除或填充缺失值

"""一、删除或填充缺失值"""
data.iloc[1429:]
new_data = data.drop(index=range(1430,1780)).fillna({'期望薪资':'无'})

将不同单位的薪资形式,转化成统一形式

"""二、将不同单位的薪资形式,转化成统一形式"""
print(new_data['期望薪资'].str[-6:].value_counts())

将不规则的薪资形式转化为统一形式

"""将不规则的薪资形式转化为统一形式"""
new_data.loc[new_data['期望薪资'].str[-6:]=='万以下元/年','期望薪资']= '0-2万元/年'
new_data.loc[new_data['期望薪资'].str[-5:]=='以下元/月','期望薪资']='0-1500元/月'

new_data['期望薪资'].str[-4:].value_counts()

"""将统一后的不同单位的薪资,统一转化成平均月薪(元/月)"""

def salary_proc(salary):
"""将传入的薪资转化成统一的平均月薪"""
if salary == '无':
return 0
elif re.search('元/月',salary):
s = re.findall('(\d+)-(\d+)元/月',salary)
# s=[('1000','10000')]
mi,ma = int(s[0][0]),int(s[0][1])
return (mi+ma)*0.5
elif re.search('万元/年',salary):
s = re.findall('(\d+)-(\d+)万元/年',salary)
mi,ma = int(s[0][0]),int(s[0][1])
return (mi+ma)*0.5*10000/12
elif re.search('元/年',salary):
s = re.findall('(\d+)-(\d+)元/年',salary)
mi,ma = int(s[0][0]),int(s[0][1])
return (mi+ma)*0.5/12
else:
return -1

"""新增列保存平均月薪"""
"""一、for 效率低"""
new_data['mean_salary']=0
for i in new_data['期望薪资'].index:
new_data.loc[i,'mean_salary']=salary_proc(new_data.loc[i,'期望薪资'])

"""二、apply(),矢量化字符串的方法,效率高"""
new_data['mean_salary2'] = new_data['期望薪资'].apply(salary_proc)

# new_data.iloc[:,-2:]
"""三、进行切分"""
bins = [0,2000,4000,6000,8000,10000,1000000]
labels =['0-2000','2000-3999','4000-5999','6000-7999','8000-9999','>10000']
new_data['salary_class']=pd.cut(new_data['mean_salary'],bins,labels=labels,right=False)# right 改变区间的闭合方式

new_data['salary_class'].value_counts()

二、 对AA列进行清洗,要求分成三类全包含(PhotoShop,Corel DRAW,AI),三项,只包含其中一项或两项,全不包含

处理缺失值

"""处理缺失值"""
new_data['技能/语言'].fillna('无',inplace=True)

"""提取技能关键词"""
new_data['skill'] = new_data['技能/语言'].str.findall('[a-zA-Z0-9\s#.\+/]+')
"""处理技能词前后的空格,并统一转化成小写"""
new_data['skill2']=''
for i in new_data['skill'].index:
new_data.loc[i,'skill2']=",".join(map(lambda x:x.strip().lower(),new_data.loc[i,'skill']))

"""将每个人的技能和目标技能进行比较,统计技能数"""
new_data['skill_class']=0
s = ['photoshop','corel draw','ai']
for i in new_data['skill2'].index:
skill = new_data['skill2'].iloc[i]
b = 0
for j in s:
if j in skill:
b+=1
new_data.loc[i,'skill_class']=b

new_data['skill_class'].value_counts()

new_data['skill_class'].map({0:'全不包含',1:'包含其中一项',2:'包含其中的两项',3:'三项技能全包含'})