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. (*)检索按照工资从高到低排序检索从第六名开始一共四个人的信息: ...
随机推荐
- 用c语言实现linux cat
话不多说,直接上代码: #include <stdio.h> void file_copy(FILE * file1,FILE * file2); int main(int argc,ch ...
- Oracle体系结构概述与SQL解析剖析
Oracle服务器 是一个数据库管理系统,它提供了一种全面.开放.集成的方法来管理信息. Oracle服务器由Oracle数据库和Oracle实例组成. oracle数据库软件和Oracle数据库软件 ...
- Python数据类型--集合(set)
Python的集合是无序.可迭代的容器对象,所有元素放在一对大括号中{},元素之间使用逗号隔开,同一集合内的元素具有唯一性,不允许重复. 集合中只能包含数字.字符串.元组等不可变类型的数据,不能包含列 ...
- 多测师肖sir_pdf转word方法
1.百度搜索 my love pdf 在线转换 2.输入wps 下载软件
- 自定义 Spring Boot Starter
关于Starter Spring Boot秉承"约定大于配置"的开发方式,使得我们基于Spring Boot开发项目的效率变得十分高.相信使用过Spring Boot的小伙伴都会发 ...
- lftp源码安装时 error: Package requirements (gnutls >= 1.0.0) were not met: No package 'gnutls' found
lftp 使用疑惑与解决方法: 一,从官网下载源码后,解压./configure后,报错: error: Package requirements (gnutls >= 1.0.0) were ...
- 【学习笔记】Min-max 容斥
经常和概率期望题相结合. 对于全序集合 \(S\),有: \[\max S=\sum\limits_{T\subseteq S,T\not=\varnothing}(-1)^{\vert T\vert ...
- 使用docker安装E
环境 虚拟机软件VmWare15.5 Centos7.0 安装docker yum install docker
- swoft实现自动重启服务 转
目的:1.上传代码后HTTP服务自动重启,不需要自己手动执行:php bin/swoft http:start2.自动重启适用于开发调试阶段,因为不能再后台运行所以在线上环境的话还是要重启http服务 ...
- php 注册器模式 工厂模式
<?php /** * 注册器模式 * 全局共享和交换对象 */ class Register { public static $objects; // 定义全局数组 // 保存对象到全局数组 ...