Pandas_工资集处理
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
# 1--读取数据文件
file_obj=open('Baltimore_City_Employee_Salaries_FY2016.csv')
salary_df=pd.read_csv(file_obj)
file_obj.close()
salary_df.head()
{ vertical-align: top }
.dataframe thead th { text-align: right }
| Name | JobTitle | AgencyID | Agency | HireDate | AnnualSalary | GrossPay | |
|---|---|---|---|---|---|---|---|
| 0 | Aaron,Patricia G | Facilities/Office Services II | A03031 | OED-Employment Dev (031) | 10/24/1979 12:00:00 AM | $56705.00 | $54135.44 |
| 1 | Aaron,Petra L | ASSISTANT STATE'S ATTORNEY | A29045 | States Attorneys Office (045) | 09/25/2006 12:00:00 AM | $75500.00 | $72445.87 |
| 2 | Abbey,Emmanuel | CONTRACT SERV SPEC II | A40001 | M-R Info Technology (001) | 05/01/2013 12:00:00 AM | $60060.00 | $59602.58 |
| 3 | Abbott-Cole,Michelle | Operations Officer III | A90005 | TRANS-Traffic (005) | 11/28/2014 12:00:00 AM | $70000.00 | $59517.21 |
| 4 | Abdal-Rahim,Naim A | EMT Firefighter Suppression | A64120 | Fire Department (120) | 03/30/2011 12:00:00 AM | $64365.00 | $74770.82 |
# 2--查看数据情况
salary_df.shape # (13818, 7)
salary_df.describe()
salary_df.info() # 可以看到 Grosspay 的个数为 13546,不是13818,有缺失值
salary_df.isnull().sum() # 可以看到 Grosspay缺失值的个数为 272
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 13818 entries, 0 to 13817
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Name 13818 non-null object
1 JobTitle 13818 non-null object
2 AgencyID 13818 non-null object
3 Agency 13818 non-null object
4 HireDate 13818 non-null object
5 AnnualSalary 13818 non-null object
6 GrossPay 13546 non-null object
dtypes: object(7)
memory usage: 755.8+ KB
Name 0
JobTitle 0
AgencyID 0
Agency 0
HireDate 0
AnnualSalary 0
GrossPay 272
dtype: int64
# 3--数据清理
# 3-1)删除缺失值
salary_df=salary_df.dropna(how='any',axis=0) # 删除存在缺失值的整行数据
salary_df.isnull().sum()
Name 0
JobTitle 0
AgencyID 0
Agency 0
HireDate 0
AnnualSalary 0
GrossPay 0
dtype: int64
# 3-2)去除 AnnualSalary,GrossPay 两列中的 $号,并将这两列数据类型转为 float
salary_df['AnnualSalary']=salary_df['AnnualSalary'].str.strip('$')
salary_df['GrossPay']=salary_df['GrossPay'].str.strip('$')
salary_df.head()
{ vertical-align: top }
.dataframe thead th { text-align: right }
| Name | JobTitle | AgencyID | Agency | HireDate | AnnualSalary | GrossPay | |
|---|---|---|---|---|---|---|---|
| 0 | Aaron,Patricia G | Facilities/Office Services II | A03031 | OED-Employment Dev (031) | 10/24/1979 12:00:00 AM | 56705.00 | 54135.44 |
| 1 | Aaron,Petra L | ASSISTANT STATE'S ATTORNEY | A29045 | States Attorneys Office (045) | 09/25/2006 12:00:00 AM | 75500.00 | 72445.87 |
| 2 | Abbey,Emmanuel | CONTRACT SERV SPEC II | A40001 | M-R Info Technology (001) | 05/01/2013 12:00:00 AM | 60060.00 | 59602.58 |
| 3 | Abbott-Cole,Michelle | Operations Officer III | A90005 | TRANS-Traffic (005) | 11/28/2014 12:00:00 AM | 70000.00 | 59517.21 |
| 4 | Abdal-Rahim,Naim A | EMT Firefighter Suppression | A64120 | Fire Department (120) | 03/30/2011 12:00:00 AM | 64365.00 | 74770.82 |
salary_df['GrossPay'].dtype # dtype('O') 不是 dtype('float')
# salary_df['AnnualSalary']=salary_df['AnnualSalary'].astype(float)
# salary_df['GrossPay']=salary_df['GrossPay'].astype(float) # 直接用下面这句:
salary_df[['AnnualSalary','GrossPay']]=salary_df[['AnnualSalary','GrossPay']].astype(float)
salary_df['GrossPay'].dtype # dtype('float64')
dtype('O')
# 3-3) 新建一列,用于存放入职月份:
salary_df['month']=salary_df['HireDate'].str.split('/').str[0] # 或者:
# salary_df['month']=salary_df['HireDate'].str.split('/').str.get(0)
salary_df.head()
salary_df[['HireDate','month']].head() # 只查看这两列
{ vertical-align: top }
.dataframe thead th { text-align: right }
| HireDate | month | |
|---|---|---|
| 0 | 10/24/1979 12:00:00 AM | 10 |
| 1 | 09/25/2006 12:00:00 AM | 09 |
| 2 | 05/01/2013 12:00:00 AM | 05 |
| 3 | 11/28/2014 12:00:00 AM | 11 |
| 4 | 03/30/2011 12:00:00 AM | 03 |
# 4--数据探索
# 4-1)工资分布:
salary_df['AnnualSalary'].hist(bins=20) # 基本呈正态分布,高薪的人员较少,30000美元左右的人最多
<matplotlib.axes._subplots.AxesSubplot at 0x21999d528c8>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Qb3Vh1N-1585835263436)(output_6_1.png)]
# 4-2)入职月份统计:
month=salary_df['month'].value_counts()
month.plot(kind='barh') # 6月份入职人数最多,HR最忙
<matplotlib.axes._subplots.AxesSubplot at 0x219a114ef08>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bycizMRr-1585835263437)(output_7_1.png)]
# 5-聚合运算
# 5-1)计算年薪平均值和职位个数:
salary_df['AnnualSalary'].mean() # 53507.98394359959 所有员工的平均年薪
# 5-2) 计算各职位的年薪平均值 看哪个职位的平均工资高,职位数,及该职位的最高工资
salary_df.groupby('JobTitle')['AnnualSalary'].mean()
salary_df.groupby('JobTitle')['AnnualSalary'].agg(['mean','count','max'])
{ vertical-align: top }
.dataframe thead th { text-align: right }
| mean | count | max | |
|---|---|---|---|
| JobTitle | |||
| 911 LEAD OPERATOR | 49816.750000 | 4 | 50162.0 |
| 911 OPERATOR | 44829.461538 | 65 | 50829.0 |
| 911 OPERATOR SUPERVISOR | 57203.500000 | 4 | 57579.0 |
| ACCOUNT EXECUTIVE | 57200.000000 | 4 | 57200.0 |
| ACCOUNTANT I | 49065.866667 | 15 | 57579.0 |
| ... | ... | ... | ... |
| ZONING APPEALS ADVISOR BMZA | 53636.000000 | 1 | 53636.0 |
| ZONING APPEALS OFFICER | 67800.000000 | 1 | 67800.0 |
| ZONING ENFORCEMENT OFFICER | 65800.000000 | 1 | 65800.0 |
| ZONING EXAMINER I | 45628.500000 | 2 | 48811.0 |
| ZONING EXAMINER II | 56150.000000 | 1 | 56150.0 |
1034 rows × 3 columns
# 5-3) 对上述各职位的年薪的平均值进行降序排列
jobtitle_salary_df=salary_df.groupby('JobTitle')['AnnualSalary'].agg(['mean','count','max'])
jobtitle_sort_salary_df=jobtitle_salary_df.sort_values(by='mean',ascending=False)[:30] # 知识点:df.sort_values(by=列名,ascending=False)
jobtitle_sort_salary_df['mean'].plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x219a52aa788>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tlawTPZu-1585835263439)(output_9_1.png)]
# 5-4) 对上述各职位的人数进行降序排列
jobtitle_salary_df=salary_df.groupby('JobTitle')['AnnualSalary'].agg(['mean','count','max'])
jobtitle_sort_salary_df=jobtitle_salary_df.sort_values(by='count',ascending=False)[:30] # 知识点:df.sort_values(by=列名,ascending=False)
jobtitle_sort_salary_df['count'].plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x219a6327e48>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u6352dec-1585835263439)(output_10_1.png)]
# 我们再看看其他的需求:
# 从头开始:
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
# 1--读取数据文件
file_obj=open('Baltimore_City_Employee_Salaries_FY2016.csv')
salary_df=pd.read_csv(file_obj)
file_obj.close()
# 2--删除含缺失值的行,
salary_df=salary_df.dropna(how='any',axis=0) # 删除存在缺失值的整行数据
salary_df.isnull().sum()
# 3--去除 AnnualSalary,GrossPay 两列中的 $号,并将这两列数据类型转为 float
salary_df['AnnualSalary']=salary_df['AnnualSalary'].str.strip('$')
salary_df['GrossPay']=salary_df['GrossPay'].str.strip('$')
salary_df[['AnnualSalary','GrossPay']]=salary_df[['AnnualSalary','GrossPay']].astype(float)
salary_df.head()
# 4--查看 AnnualSalary的最大值及所在的行号:
salary_df['AnnualSalary'].max() # 238772.0
salary_df['AnnualSalary'].argmax() # 8701 # se.argmax()之前没有学到,这里补充一下
8701
Pandas_工资集处理的更多相关文章
- 【干货分享】前端面试知识点锦集04(Others篇)——附答案
四.Others部分 技术类 1.http状态码有哪些?分别代表是什么意思? (1).成功2×× 成功处理了请求的状态码.200 服务器已成功处理了请求并提供了请求的网页.204 服务器成功处理了请求 ...
- 【干货分享】前端面试知识点锦集01(HTML篇)——附答案
一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层分别是:HTML.CSS.JavaScript作用:HTML实现页面结构,CSS完成页面的表现与风格 ...
- SQL用法操作合集
SQL用法操作合集 一.表的创建 1.创建表 格式: 1 CREATE TABLE 表名 2 (列名 数据类型(宽度)[DEFAULT 表达式][COLUMN CONSTRAINT], 3 ... ...
- 《Entity Framework 6 Recipes》中文翻译系列 (18) -----第三章 查询之结果集扁平化和多属性分组
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-14 结果集扁平化 问题 你有一对多关联的两个实体,你想通过一个查询,获取关联 ...
- BW知识问答锦集2
PM面试分为BW.BO两部分,根据顾问的简历和应聘的岗位所侧重的问题不同. BW包括基础知识.增量.增强.LO抽取.数据源. BO包括 CR.CR.WEBI.UNI. 一. 基础知识 技术面试 1. ...
- Quartz集群
为什么选择Quartz: 1)资历够老,创立于1998年,比struts1还早,但是一直在更新(27 April 2012: Quartz 2.1.5 Released),文档齐全. 2)完全由Jav ...
- mysql集群之MYSQL CLUSTER
1. 参考文档 http://xuwensong.elastos.org/2014/01/13/ubuntu-%E4%B8%8Bmysql-cluster%E5%AE%89%E8%A3%85%E5%9 ...
- 项目中使用Quartz集群分享--转载
项目中使用Quartz集群分享--转载 在公司分享了Quartz,发布出来,希望大家讨论补充. CRM使用Quartz集群分享 一:CRM对定时任务的依赖与问题 二:什么是quartz,如何使用, ...
- SQL从入门到基础 - 06 限制结果集范围
一.限制结果集行数 1. Select top 5* from T_Employee order by FSalary DESC 2. (*)检索按照工资从高到低排序检索从第六名开始一共四个人的信息: ...
随机推荐
- 十一长假我肝了这本超硬核PDF,现决定开源!!
写在前面 在 [冰河技术] 微信公众号中的[互联网工程]专题,更新了不少文章,有些读者反馈说,在公众号中刷 历史文章不太方便,有时会忘记自己看到哪一篇了,当打开一篇文章时,似乎之前已经看过了,但就是不 ...
- Java-JDK动态代理(AOP)使用及实现原理分析
Java-JDK动态代理(AOP)使用及实现原理分析 第一章:代理的介绍 介绍:我们需要掌握的程度 动态代理(理解) 基于反射机制 掌握的程度: 1.什么是动态代理? 2.动态代理能够做什么? 后面我 ...
- pytest使用小结
一.pytest简洁和好处 自动发现测试用例 testloader 断言方便 ,自定义错误提示 assert 正则匹配 灵活运行指定的测试用例,指定模块,制定测试类,测试用例 -k 标签化,回归 正向 ...
- 源生代码和H5的交互 android:
1: 默认的事情: Android 通过内置的UI控件WebView来加载网页. 网页是用一个网络地址来表示的: 其整个使用方法很简单如下:(android不关心实际的 ...
- 【ST表】SCOI2016 萌萌哒
题目内容 洛谷链接 一个长度为\(n\)的大数,用\(S_1S_2S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每个条件表示为四 ...
- nginx安全: 配置http基本验证(Basic Auth)(nginx 1.18.0)
一,http基本验证的作用: 1,http基本身份验证会从浏览器弹出登录窗口, 简单明了,容易理解, 对于面向终端用户的前台来说,不够友好, 但对于内部员工操作的后台还是很有用,通常作为一层安全措施应 ...
- Cypress系列(69)- route() 命令详解
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 作用 管理控制整个网络请求 重要注意事项 ...
- mysql You can't specify target table 'sys_right_menu' for update in FROM clause (不能从Objor子句中指定目标表“SysRyType菜单)
错误语句: DELETE from sys_right_menu where right_id in (SELECT m.right_id from sys_right_menu mLEFT JO ...
- MVC实现修改数据
前言 前言 最近没什么好写的,所以写个修改来巩固一下知识 控制器 public ActionResult UpdeteCartsNum(SYS_Carts sYS_Carts) { var list ...
- ScheduledExecutor定时器
为了弥补Timer 的上述缺陷,在Java 5的时候推出了基于线程池设计的 ScheduledExecutor.其设计思想是:每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互 ...