import pandas as pd
import numpy as np
df1 = pd.read_csv('data_analysis.csv',encoding='gbk')
df2 = pd.read_csv('data_mining.csv',encoding='gbk')
df3 = pd.read_csv('deep_learning.csv',encoding='gbk')
df4 = pd.read_csv('machine_learning.csv',encoding='gbk')
data = pd.concat([df1,df2,df3,df4],ignore_index=True) #使用concat进行文件沿轴方向的连接
data.head()
共1650行
data.shape
# 数据清洗
#去除重复行数据
df = data.drop_duplicates() #去除重复行
df[df=='[]'] = np.nan # 将空数据[]替换为NAN
# 因为上面这句进行了链式操作所以出现了警告,但不影响
df = df.dropna(axis=0, how='any', inplace=False) # 去除空值NAN
df.head()
df.shape
df.dtypes
共470,每个变量都是object类型(实际上这里就是str类型,因为字符串长度是不固定的,pandas没有用字节字符串的形式而是用了object ndarray)
这里我为了方便后续演示,所以只要一行数据中存在空值我就删除了整行,导致数据量从1650直接降到了470条。
实际分析中,大家要根据自己的分析需求对数据空值进行处理。(可以看看老师发的数据分析pdf,学习一下对空值的处理思想)
下面展示针对每一列进行一些数据处理展示(仅是一种方法,如果大家有别的想法以自己的思路为主)
注意到address的内容是以['后海', '深圳湾', '科技园', '后海', '后海', '深圳湾', '深圳湾']这样的形式存在的,相似列表又有重复字符出现,因此可以通过字符串列表的互相转化实现对address字符串的处理。(详见add_str函数)
字符串列表转化可见博客https://blog.csdn.net/roytao2/article/details/53433373
def sub_str(s):
l = eval(s) # 将字符串转化为列表
l = list(set(l)) # 去除重复元素
S = " ".join(l) #列表转化为字符串
return S
df['address']=df.address.map(sub_str)
df.head(1)
这几个数据都没什么特别需要处理的,这里就不再赘述了。
这两个变量与address相似
df['industryLables']=df.industryLables.map(sub_str)
df.head(1)
df['label']=df.label.map(sub_str)
df.head(1)
这个数据主要问题是存在特殊字符\t\n\r等,同时存在数字。
如下对其进行处理,首先去除特殊字符(为了后续可以使用分词等方式,这里使用isalnum+filter的方式去除了包括标点符号在内的所有特殊字符),再使用re正则方法去除其数字。
# 以第4条数据为例
string = df['position_detail'][3]
string
# 去除特殊字符
new_string = ''.join(filter(str.isalnum, string))
print(new_string)
print("\n")
# 去除数字
import re
newstring = re.sub(r'[0-9]+', '', new_string)
print(newstring)
# 定义函数
def pos_str(s):
new_string = ''.join(filter(str.isalnum, string))
newstring = re.sub(r'[0-9]+', '', new_string)
return newstring
df['position_detail']=df.position_detail.map(pos_str)
df.head(1)
salary变量是大家主要头疼的问题,下面展示一种处理方式(主要参考了陈虹霖同学的方法):
面对8k-15k这样的数据,可以将其利用-分割为最高最低两列,然后再对高低两列使用replace将无关的“k”和“以上”等字符串进行处理,最后转化为int或者float数值型
#用dataframe方法将salary分列
cut = df['salary'].str.split('-',expand= True)
df[['low','high']] = cut
df.head(1)
#用replace转换数据类型
def convert_salary(s):
v = s.replace('k','').replace('K','').replace('以上','')
return float(v)
df['low']=df.low.map(convert_salary)
df['high']=df.high.map(convert_salary)
df.head(1)
这样就可以完成字符到数值的转换,后续就可以针对高低薪资对其处理,同学们的处理方式各有不同:取均值,describe分析,高低薪资箱线图等等都有(我个人认为取均值分析比较合理,因为有些公司的高低薪资有时候间隔很大,会影响到整体)
这两个的处理方式类似于salary,这里不再赘述。
这里主要是看大家想分析什么?
有些同学分析的各地薪资,那可以对low和high进行处理,可以使用mean,describe等函数
有些同学分析city,那可以使用python的pyecharts画地图
有些同学分析position_detail可以使用jieba等进行分词画词云
有些同学分析label,可以用jieba等方式统计词频
。。。。。。
方向很多方式也很多,大家可以针对性搜索一下,掌握最感兴趣的就好。