第1周作业问题示范

In [1]:
import pandas as pd
import numpy as np

导入数据

In [2]:
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()
Out[2]:
address advantage city company_name education industry industryLables label position_detail position_name salary size stage work_year
0 ['科华北路', '桂溪', '四川大学'] 工作氛围好 成都 达疆网络科技(上海)有限公司 本科 O2O [] ['年底双薪', '绩效奖金', '岗位晋升', '定期体检'] \r职位描述:\r\r工作职责:?\r1、负责新零售业务的数据分析工作,挖掘数据分析需求,制... 数据分析师 10k-20k 2000人以上 D轮及以上 1-3年
1 NaN 六险二金,晋升通道,独当一面,话语权 北京 贝壳找房(北京)科技有限公司 本科 移动互联网,O2O ['大数据', '商业'] ['股票期权', '带薪年假', '绩效奖金', '扁平管理'] \r职位描述:\r\r工作职责:方向一、经营分析/指标体系1. 参与公司核心策略的数据分析,... 数据分析类 25k-40k 2000人以上 C轮 5-10年
2 ['中关村', '万泉河', '苏州街'] 五险一金 北京 杭州财米科技有限公司 不限 移动互联网,金融 [] ['年底多薪', '岗位晋升', '定期体检', '五险一金'] \r职位描述:\r\r职位描述:\r1、收集、处理用户海量数据,挖掘用户行为特征,为产品、运... 数据分析师 (MJ000766) 10k-15k 500-2000人 C轮 1-3年
3 ['琶洲', '官洲'] 六险一金,周末双休,营养工作餐,萌宠陪伴 广州 广州微咔世纪信息科技有限公司 大专 移动互联网,社交网络 ['移动互联网', '社交', '数据运营'] ['六险一金', '周末双休', '营养工作餐', '暖心下午茶'] \r职位描述:\r\r职位描述:\r1.负责对业务的专题进行统计分析,形成专题分析报告;\r... 数据分析师 8k-15k 50-150人 A轮 1-3年
4 ['中关村', '北京大学', '颐和园'] 爱奇艺 北京 北京奇艺世纪科技有限公司 本科 广告营销,文化娱乐 ['大数据', 'SPSS'] ['绩效奖金', '五险一金', '交通补助', '带薪年假'] \r职位描述:\r\r岗位职责: 1、负责内容合作部产品及运营数据指标的搭建; 2、负责数据... 数据分析师 8k-12k 2000人以上 上市公司 1-3年

共1650行

In [3]:
data.shape
Out[3]:
(1650, 14)

数据清洗

In [4]:
# 数据清洗
#去除重复行数据
df = data.drop_duplicates() #去除重复行
df[df=='[]'] = np.nan  # 将空数据[]替换为NAN
# 因为上面这句进行了链式操作所以出现了警告,但不影响
df = df.dropna(axis=0, how='any', inplace=False)  # 去除空值NAN
df.head()
<ipython-input-4-461cd43de01b>:4: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df[df=='[]'] = np.nan  # 将空数据[]替换为NAN
C:\anconada\lib\site-packages\pandas\core\frame.py:2986: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  self._where(-key, value, inplace=True)
Out[4]:
address advantage city company_name education industry industryLables label position_detail position_name salary size stage work_year
3 ['琶洲', '官洲'] 六险一金,周末双休,营养工作餐,萌宠陪伴 广州 广州微咔世纪信息科技有限公司 大专 移动互联网,社交网络 ['移动互联网', '社交', '数据运营'] ['六险一金', '周末双休', '营养工作餐', '暖心下午茶'] \r职位描述:\r\r职位描述:\r1.负责对业务的专题进行统计分析,形成专题分析报告;\r... 数据分析师 8k-15k 50-150人 A轮 1-3年
4 ['中关村', '北京大学', '颐和园'] 爱奇艺 北京 北京奇艺世纪科技有限公司 本科 广告营销,文化娱乐 ['大数据', 'SPSS'] ['绩效奖金', '五险一金', '交通补助', '带薪年假'] \r职位描述:\r\r岗位职责: 1、负责内容合作部产品及运营数据指标的搭建; 2、负责数据... 数据分析师 8k-12k 2000人以上 上市公司 1-3年
6 ['后海', '深圳湾', '科技园', '后海', '后海', '深圳湾', '深圳湾',... 核心事业群 千万级日活 氛围好 组织扁平 深圳 OPPO广东移动通信有限公司 本科 移动互联网 ['大数据', '数据挖掘'] ['丰厚年终', '扁平管理', '追求极致', '本分'] \r职位描述:\r\r工作职责:?1、负责数据中心与产品团队的业务对接,为业务提供指标分析、... 数据分析师 15k-30k 2000人以上 不需要融资 1-3年
7 ['长阳路', '周家嘴路', '平凉路'] 技术大牛,私厨三餐 上海 上海流利说信息技术有限公司 本科 移动互联网,教育 ['大数据', '数据挖掘'] ['弹性工作', '五险一金', '年度旅游', '年底双薪'] \r职位描述:\r\r岗位职责:\r通过指标的设计、计算、监控和评估,支持产品决策;对数据仓... 数据分析师 18k-32k 500-2000人 C轮 1-3年
8 ['古荡', '文一路', '文三路', '古荡', '古荡', '文一路', '文一路',... 股票期权;年终奖金;弹性工作 杭州 杭州铜板街互联网金融信息服务有限公司 本科 移动互联网 ['金融'] ['创新开放', '团队牛X', '全员期权', '高速成长'] \r职位描述:\r\r工作职责:1、独立专题分析报告;2、业务日报、月报;3、基于用户交易、... 数据分析师 15k-30k 150-500人 B轮 3-5年
In [5]:
df.shape
Out[5]:
(470, 14)
In [6]:
df.dtypes
Out[6]:
address            object
advantage          object
city               object
company_name       object
education          object
industry           object
industryLables     object
label              object
position_detail    object
position_name      object
salary             object
size               object
stage              object
work_year          object
dtype: object

共470,每个变量都是object类型(实际上这里就是str类型,因为字符串长度是不固定的,pandas没有用字节字符串的形式而是用了object ndarray)
这里我为了方便后续演示,所以只要一行数据中存在空值我就删除了整行,导致数据量从1650直接降到了470条。
实际分析中,大家要根据自己的分析需求对数据空值进行处理。(可以看看老师发的数据分析pdf,学习一下对空值的处理思想)

数据处理

下面展示针对每一列进行一些数据处理展示(仅是一种方法,如果大家有别的想法以自己的思路为主)

1、address

注意到address的内容是以['后海', '深圳湾', '科技园', '后海', '后海', '深圳湾', '深圳湾']这样的形式存在的,相似列表又有重复字符出现,因此可以通过字符串列表的互相转化实现对address字符串的处理。(详见add_str函数)
字符串列表转化可见博客https://blog.csdn.net/roytao2/article/details/53433373

In [7]:
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)
Out[7]:
address advantage city company_name education industry industryLables label position_detail position_name salary size stage work_year
3 官洲 琶洲 六险一金,周末双休,营养工作餐,萌宠陪伴 广州 广州微咔世纪信息科技有限公司 大专 移动互联网,社交网络 ['移动互联网', '社交', '数据运营'] ['六险一金', '周末双休', '营养工作餐', '暖心下午茶'] \r职位描述:\r\r职位描述:\r1.负责对业务的专题进行统计分析,形成专题分析报告;\r... 数据分析师 8k-15k 50-150人 A轮 1-3年

2、advantage、city、company、education、industry、stage

这几个数据都没什么特别需要处理的,这里就不再赘述了。

3、industryLables、Label

这两个变量与address相似

In [8]:
df['industryLables']=df.industryLables.map(sub_str)
df.head(1)
Out[8]:
address advantage city company_name education industry industryLables label position_detail position_name salary size stage work_year
3 官洲 琶洲 六险一金,周末双休,营养工作餐,萌宠陪伴 广州 广州微咔世纪信息科技有限公司 大专 移动互联网,社交网络 社交 数据运营 移动互联网 ['六险一金', '周末双休', '营养工作餐', '暖心下午茶'] \r职位描述:\r\r职位描述:\r1.负责对业务的专题进行统计分析,形成专题分析报告;\r... 数据分析师 8k-15k 50-150人 A轮 1-3年
In [9]:
df['label']=df.label.map(sub_str)
df.head(1)
Out[9]:
address advantage city company_name education industry industryLables label position_detail position_name salary size stage work_year
3 官洲 琶洲 六险一金,周末双休,营养工作餐,萌宠陪伴 广州 广州微咔世纪信息科技有限公司 大专 移动互联网,社交网络 社交 数据运营 移动互联网 营养工作餐 六险一金 暖心下午茶 周末双休 \r职位描述:\r\r职位描述:\r1.负责对业务的专题进行统计分析,形成专题分析报告;\r... 数据分析师 8k-15k 50-150人 A轮 1-3年

4、position_detail

这个数据主要问题是存在特殊字符\t\n\r等,同时存在数字。
如下对其进行处理,首先去除特殊字符(为了后续可以使用分词等方式,这里使用isalnum+filter的方式去除了包括标点符号在内的所有特殊字符),再使用re正则方法去除其数字。

In [17]:
# 以第4条数据为例
string = df['position_detail'][3]
string
Out[17]:
'\r职位描述:\r\r职位描述:\r1.负责对业务的专题进行统计分析,形成专题分析报告;\r2.基于业务理解,设计搭建准确反映业务运作健康状况的数据分析报表;\r3.分析用户行为,为产品、运营以及管理层提供商业策略分析和业务优化建议,持续改进运营效果;\r4.完成上级安排的数据整理分析等相关任务;\r\r岗位要求:\r1.数学与应用数学、统计学等专业毕业,1年以上数据分析工作经验,有相关经验者可适当放宽该要求;\r2.良好的数据处理能力,熟练操作Excel、PPT等,掌握SQL相关数据提取方法或者常用数据分析工具者优先;\r3.协调沟通能力较好,具有较强的分析与判断能力,工作责任感高,条理清晰,工作细致,具有较好的职业操守。\r4.移动互联网从业背景优先,有APP运营推广、APP市场投放分析经验者优先。\r\r关于公司福利:\r员工福利:周末双休、六险一金、十三薪;\r零食工作餐:营养工作餐、零食饮料畅享;\r公司环境:地铁上盖、一线江景写字楼、萌宠陪伴、鲜肉仙女满地跑;\r节假日福利:生日节庆贴心礼物、开门红包;\r灵活休假:弹性工作制、带薪休假、病假;\r多彩团建:年度旅游、部门活动基金、生日会、下午茶等high起来;\r劳逸结合:各种运动俱乐部(篮球、羽毛球等)、狼人杀、王者农药,我们的青春,我们做主。\r\r'
In [18]:
# 去除特殊字符
new_string = ''.join(filter(str.isalnum, string)) 
print(new_string)
print("\n")
# 去除数字
import re
newstring = re.sub(r'[0-9]+', '', new_string)
print(newstring)
职位描述职位描述1负责对业务的专题进行统计分析形成专题分析报告2基于业务理解设计搭建准确反映业务运作健康状况的数据分析报表3分析用户行为为产品运营以及管理层提供商业策略分析和业务优化建议持续改进运营效果4完成上级安排的数据整理分析等相关任务岗位要求1数学与应用数学统计学等专业毕业1年以上数据分析工作经验有相关经验者可适当放宽该要求2良好的数据处理能力熟练操作ExcelPPT等掌握SQL相关数据提取方法或者常用数据分析工具者优先3协调沟通能力较好具有较强的分析与判断能力工作责任感高条理清晰工作细致具有较好的职业操守4移动互联网从业背景优先有APP运营推广APP市场投放分析经验者优先关于公司福利员工福利周末双休六险一金十三薪零食工作餐营养工作餐零食饮料畅享公司环境地铁上盖一线江景写字楼萌宠陪伴鲜肉仙女满地跑节假日福利生日节庆贴心礼物开门红包灵活休假弹性工作制带薪休假病假多彩团建年度旅游部门活动基金生日会下午茶等high起来劳逸结合各种运动俱乐部篮球羽毛球等狼人杀王者农药我们的青春我们做主


职位描述职位描述负责对业务的专题进行统计分析形成专题分析报告基于业务理解设计搭建准确反映业务运作健康状况的数据分析报表分析用户行为为产品运营以及管理层提供商业策略分析和业务优化建议持续改进运营效果完成上级安排的数据整理分析等相关任务岗位要求数学与应用数学统计学等专业毕业年以上数据分析工作经验有相关经验者可适当放宽该要求良好的数据处理能力熟练操作ExcelPPT等掌握SQL相关数据提取方法或者常用数据分析工具者优先协调沟通能力较好具有较强的分析与判断能力工作责任感高条理清晰工作细致具有较好的职业操守移动互联网从业背景优先有APP运营推广APP市场投放分析经验者优先关于公司福利员工福利周末双休六险一金十三薪零食工作餐营养工作餐零食饮料畅享公司环境地铁上盖一线江景写字楼萌宠陪伴鲜肉仙女满地跑节假日福利生日节庆贴心礼物开门红包灵活休假弹性工作制带薪休假病假多彩团建年度旅游部门活动基金生日会下午茶等high起来劳逸结合各种运动俱乐部篮球羽毛球等狼人杀王者农药我们的青春我们做主
In [20]:
# 定义函数
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)
Out[20]:
address advantage city company_name education industry industryLables label position_detail position_name salary size stage work_year
3 官洲 琶洲 六险一金,周末双休,营养工作餐,萌宠陪伴 广州 广州微咔世纪信息科技有限公司 大专 移动互联网,社交网络 社交 数据运营 移动互联网 营养工作餐 六险一金 暖心下午茶 周末双休 职位描述职位描述负责对业务的专题进行统计分析形成专题分析报告基于业务理解设计搭建准确反映业务... 数据分析师 8k-15k 50-150人 A轮 1-3年

5、salary

salary变量是大家主要头疼的问题,下面展示一种处理方式(主要参考了陈虹霖同学的方法):
面对8k-15k这样的数据,可以将其利用-分割为最高最低两列,然后再对高低两列使用replace将无关的“k”和“以上”等字符串进行处理,最后转化为int或者float数值型

In [21]:
#用dataframe方法将salary分列
cut = df['salary'].str.split('-',expand= True)
df[['low','high']] = cut
df.head(1)
Out[21]:
address advantage city company_name education industry industryLables label position_detail position_name salary size stage work_year low high
3 官洲 琶洲 六险一金,周末双休,营养工作餐,萌宠陪伴 广州 广州微咔世纪信息科技有限公司 大专 移动互联网,社交网络 社交 数据运营 移动互联网 营养工作餐 六险一金 暖心下午茶 周末双休 职位描述职位描述负责对业务的专题进行统计分析形成专题分析报告基于业务理解设计搭建准确反映业务... 数据分析师 8k-15k 50-150人 A轮 1-3年 8k 15k
In [23]:
#用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)
Out[23]:
address advantage city company_name education industry industryLables label position_detail position_name salary size stage work_year low high
3 官洲 琶洲 六险一金,周末双休,营养工作餐,萌宠陪伴 广州 广州微咔世纪信息科技有限公司 大专 移动互联网,社交网络 社交 数据运营 移动互联网 营养工作餐 六险一金 暖心下午茶 周末双休 职位描述职位描述负责对业务的专题进行统计分析形成专题分析报告基于业务理解设计搭建准确反映业务... 数据分析师 8k-15k 50-150人 A轮 1-3年 8.0 15.0

这样就可以完成字符到数值的转换,后续就可以针对高低薪资对其处理,同学们的处理方式各有不同:取均值,describe分析,高低薪资箱线图等等都有(我个人认为取均值分析比较合理,因为有些公司的高低薪资有时候间隔很大,会影响到整体)

6、size、work_year

这两个的处理方式类似于salary,这里不再赘述。

数据分析

这里主要是看大家想分析什么?
有些同学分析的各地薪资,那可以对low和high进行处理,可以使用mean,describe等函数
有些同学分析city,那可以使用python的pyecharts画地图
有些同学分析position_detail可以使用jieba等进行分词画词云
有些同学分析label,可以用jieba等方式统计词频
。。。。。。
方向很多方式也很多,大家可以针对性搜索一下,掌握最感兴趣的就好。

In [ ]: