当前位置:   article > 正文

Python学习笔记,51job数据清洗篇_用for 循环对于薪资数据进行清洗

用for 循环对于薪资数据进行清洗

数据清洗篇

思路:
1.主要分析的python资薪情况。而工资会有几种情况,如万/月;万/年;千/月;万以上/年;万以上/月;这明显就不方便我们分析。在这个我们统一转化为10k/月的形式进行分析。
2.明确目标,这里使用split,replace,lambda来进行数据清洗。

还是先上代码:

import pymysql
import pandas as pda
import numpy as npy
import re
import matplotlib.pylab as pyl
import matplotlib.mlab as mlab  
import matplotlib.pyplot as plt  
#连接数据库
conn = pymysql.connect(host="127.0.0.1",user="root",passwd="lxw19961230",db="51job")
sql = "select * from python_1"
data = pda.read_sql(sql,conn)

#筛选出有万和月的
wan_yue=[]
#计数变量,统计万以上出现的次数
count1 = 0
data_money=data['money'].dropna()

#统计万以上的数据
wan_yis=[]
#统计万和年的数据
wan_nian=[]
count3=0
for i in data_money:
    if '以上' in i and '月' in i:
        wan_yis.append(i)
        count1 += 1
        continue
    if "年" in i and "万" in i and "以下" not in i and "以上" not in i:
        wan_nian.append(i)
        count3 += 1
        continue
    if '月' in i and type(i)==str:
        if '万' in i:
            wan_yue.append(i)
'''----------------------------------------------------------------------------------'''
#字符串分割,去掉月,整理为 1-2万 的格式
wan_yue_split=[]
for c in wan_yue:
    wan_yue_split.append(re.split('[-/]',c))

#最小值组成列表
minw=[]
for e in wan_yue_split:
    minw.append(e[0])

#整理最小值格式,转化为以k为单位的数据(str类型)
minww=[]
for ff in minw:
    if len(ff)==1:
        ff=ff+'0'
    else:
        ff=ff.replace('.','')
    minww.append(ff)

#minww求和,先转化为float类型
wan_yue_min = []
for hh in minww:
    hhh=float(hh)
    wan_yue_min.append(hhh)
sum_wan_yue_min = sum(wan_yue_min) 
#所有工资最小值的平均值
wan_yue_min_avg=sum_wan_yue_min/(len(wan_yue_min)-count1)
print("最低工资平均值(筛选的万/月,单位k):",wan_yue_min_avg)

#最大值组成列表
maxw=list(map(lambda x:x[1].strip('万'),wan_yue_split))
#整理最大值格式,转化为以k为单位的数据(str类型)
maxww=[]
for f in maxw:
    if len(f)==1:
        f=f+'0'
    else:
        f=f.replace('.','')
    maxww.append(f)
#maxww求和,先转化为float类型
wan_yue_max=[]
for h in maxww:
    wan_yue_max.append(float(h))
sum_wanyue_max = sum(wan_yue_max)
#所有工资最大值的平均值
wan_yue_max_avg=sum_wanyue_max/(len(maxww)-count1)
print("最低工资平均值(筛选万/月,单位k):",wan_yue_max_avg)

'''-------------------------------------------------------------------------------'''

#万以上的数据(万以上/月)
wan_yis_split=[]
for i in wan_yis:
    wan_yis_split.append(i.replace("万以上/月",""))
wan_yis_av=[]
for j in wan_yis_split:
    wan_yis_av.append(float(j))
wan_yis_sum = sum(wan_yis_av)
wan_yis_avg = wan_yis_sum/count1
print("万以上/月的平均工资为:",wan_yis_avg)

'''-----------------------------------------------------------------------------'''

#万和年的数据
wan_nian_split=[]
#整理为20-30万的格式
for c in wan_nian:
    wan_nian_split.append(re.split('[-/]',c))
#最小值组成列表
minnn=[]
for e in wan_nian_split:
    minnn.append(e[0])
#minnn求和,先转化为float类型
wan_nian_min = []
for hh in minnn:
    hhh=float(hh)
    wan_nian_min.append(hhh)
sum_wan_nian_min = sum(wan_nian_min) 
#所有工资最小值的平均值,转化为多少万/月,方便比较
wan_nian_min_avg=sum_wan_nian_min/(count3*1.2)
print("万/年的最低工资平均值(转化为万/月,单位k):",wan_nian_min_avg)

#最大值组成列表
maxnn=list(map(lambda x:x[1].strip('万'),wan_nian_split))
#整理最大值格式,转化为以k为单位的数据(str类型)
wan_nian_max=[]
for f in maxnn:
    wan_nian_max.append(f)
#wan_nian_max求和,先转化为float类型
wan_nian_max_av=[]
for h in wan_nian_max:
    wan_nian_max_av.append(float(h))
sum_wanyue_max=sum(wan_nian_max_av)
#所有工资最大值的平均值
wan_nian_max_avg=sum_wanyue_max/(count3*1.2)
print("万/年的最高工资平均值(转化为万/月,单位k):",wan_nian_max_avg)

'''------------------------------------------------------------------------------------'''

#筛选出千和月的
qian_yue=[]
count2 = 0
aa=data['money'].dropna()
for j in aa:
    if '以下' in j:
        count2 += 1
        continue
    if '月' in j and type(j)==str:
        if '千' in j:
            qian_yue.append(j)
#分割字符
qian_yue_split=[]
for n in qian_yue:
    qian_yue_split.append(re.split('[-/]',n))
#最小值列表
minq=[]
for x in qian_yue_split:
    minq.append(x[0])

#最小求和,转化为float类型
qian_yue_min=[]
for y in minq:
    qian_yue_min.append(float(y))
sum_qian_yue_min=sum(qian_yue_min)
#求平均值
qian_yue_min_avg=sum_qian_yue_min/(len(qian_yue_min)-count2)
print("最低工资平均值(筛选千/月,单位k):",qian_yue_min_avg)

#最大值列表
v=list(map(lambda x:x[1].strip('千'),qian_yue_split))
qian_yue_max=[]
for i in v:
    qian_yue_max.append(float(i))
sum_qian_yue_max=sum(qian_yue_max)
qian_yue_max_avg=sum_qian_yue_max/(len(qian_yue_max)-count2)
print("最高工资平均值(筛选千/月,单位k):",qian_yue_max_avg)

'''-------------以上为各数据平均值分析---------------------'''   
#整合数据
#万/月,计算其平均值,存储到一个列表中
avg=[]
for i in range(0,len(wan_yue_min)):
    avg.append((wan_yue_min[i]+wan_yue_max[i])/2)
#万以上的整合入列表中
for i in range(0,len(wan_yis_av)):
    avg.append(wan_yis_av[i])
#将万/年整理进列表2.4=1.2*2
for i in range(0,len(wan_nian_min)):
    avg.append((wan_nian_min[i]+wan_nian_max_av[i])/2.4)
#千/月整理进列表中
for i in range(0,len(qian_yue_min)):
    avg.append((qian_yue_min[i]+qian_yue_max[i])/2)

'''-------------以上整理到一个列表中,方便分析--------------'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190

代码思路:
1.首先利用if语句将各个工资情况,进行分类;

2.分析工资构造,如1-1.5万/月,可以发现有最高工资和最低工资
最低工资提取:

#字符串分割,去掉月,整理为 1-2万 的格式
wan_yue_split=[]
for c in wan_yue:
    wan_yue_split.append(re.split('[-/]',c))

#最小值组成列表
minw=[]
for e in wan_yue_split:
    minw.append(e[0])

#整理最小值格式,转化为以k为单位的数据(str类型)
minww=[]
for ff in minw:
    if len(ff)==1:
        ff=ff+'0'
    else:
        ff=ff.replace('.','')
    minww.append(ff)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

最高工资提取:

#最大值组成列表
maxw=list(map(lambda x:x[1].strip('万'),wan_yue_split))
#整理最大值格式,转化为以k为单位的数据(str类型)
maxww=[]
for f in maxw:
    if len(f)==1:
        f=f+'0'
    else:
        f=f.replace('.','')
    maxww.append(f)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3.将工资转化为float类型,同时可以计算一下平均工资,存到同一个列表中方便后续的可视化分析;

#整合数据
#万/月,计算其平均值,存储到一个列表中
avg=[]
for i in range(0,len(wan_yue_min)):
    avg.append((wan_yue_min[i]+wan_yue_max[i])/2)
#万以上的整合入列表中
for i in range(0,len(wan_yis_av)):
    avg.append(wan_yis_av[i])
#将万/年整理进列表2.4=1.2*2
for i in range(0,len(wan_nian_min)):
    avg.append((wan_nian_min[i]+wan_nian_max_av[i])/2.4)
#千/月整理进列表中
for i in range(0,len(qian_yue_min)):
    avg.append((qian_yue_min[i]+qian_yue_max[i])/2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

到这里基本的数据清洗可以告一段落了,可以进行数据分析,可视化

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/604326
推荐阅读
相关标签
  

闽ICP备14008679号