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()
.dataframe tbody tr th:only-of-type { vertical-align: middle }
{ 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()
.dataframe tbody tr th:only-of-type { vertical-align: middle }
{ 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() # 只查看这两列
.dataframe tbody tr th:only-of-type { vertical-align: middle }
{ 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'])
.dataframe tbody tr th:only-of-type { vertical-align: middle }
{ 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_工资集处理的更多相关文章

  1. 【干货分享】前端面试知识点锦集04(Others篇)——附答案

    四.Others部分 技术类 1.http状态码有哪些?分别代表是什么意思? (1).成功2×× 成功处理了请求的状态码.200 服务器已成功处理了请求并提供了请求的网页.204 服务器成功处理了请求 ...

  2. 【干货分享】前端面试知识点锦集01(HTML篇)——附答案

    一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层分别是:HTML.CSS.JavaScript作用:HTML实现页面结构,CSS完成页面的表现与风格 ...

  3. SQL用法操作合集

    SQL用法操作合集   一.表的创建 1.创建表 格式: 1 CREATE TABLE 表名 2 (列名 数据类型(宽度)[DEFAULT 表达式][COLUMN CONSTRAINT], 3 ... ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 (18) -----第三章 查询之结果集扁平化和多属性分组

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-14  结果集扁平化 问题 你有一对多关联的两个实体,你想通过一个查询,获取关联 ...

  5. BW知识问答锦集2

    PM面试分为BW.BO两部分,根据顾问的简历和应聘的岗位所侧重的问题不同. BW包括基础知识.增量.增强.LO抽取.数据源. BO包括 CR.CR.WEBI.UNI. 一. 基础知识 技术面试 1. ...

  6. Quartz集群

    为什么选择Quartz: 1)资历够老,创立于1998年,比struts1还早,但是一直在更新(27 April 2012: Quartz 2.1.5 Released),文档齐全. 2)完全由Jav ...

  7. mysql集群之MYSQL CLUSTER

    1. 参考文档 http://xuwensong.elastos.org/2014/01/13/ubuntu-%E4%B8%8Bmysql-cluster%E5%AE%89%E8%A3%85%E5%9 ...

  8. 项目中使用Quartz集群分享--转载

    项目中使用Quartz集群分享--转载 在公司分享了Quartz,发布出来,希望大家讨论补充. CRM使用Quartz集群分享  一:CRM对定时任务的依赖与问题  二:什么是quartz,如何使用, ...

  9. SQL从入门到基础 - 06 限制结果集范围

    一.限制结果集行数 1. Select top 5* from T_Employee order by FSalary DESC 2. (*)检索按照工资从高到低排序检索从第六名开始一共四个人的信息: ...

随机推荐

  1. spring-boot-route(十三)整合RabbitMQ

    这篇是SpringBoot整合消息队列的第一篇文章,我们详细介绍下消息队列的相关内容. 消息队列简介 1. 什么是消息队列 MQ(Message Quene):通过典型的生产者和消费者模型,生产者不断 ...

  2. axio跨域请求,vue中的config的配置项。

    这是我用 vue cli 脚手架搭建的跨域.以上是可以请求到的.

  3. Python 疑难问题:[] 与 list() 哪个快?为什么快?快多少呢?

    本文出自"Python为什么"系列,请查看全部文章 在日常使用 Python 时,我们经常需要创建一个列表,相信大家都很熟练了吧? # 方法一:使用成对的方括号语法 list_a ...

  4. ABAP 7.55 新特性 (一)

    最近几天,SAP S4 2020对应的ABAP 7.55的新版文档已经出现.本文翻译了ABAP SQL之外的更新部分.ABAP SQL的更新比较长,会再之后单独成篇. 译者水平有限,如有错误,请评论指 ...

  5. es 讲义

    链接: https://pan.baidu.com/s/193jObXs85OZcvAHDycUXlw 提取码: ewbp

  6. 第十七章 DNS原理

    一.DNS的相关介绍 1.主机名与IP地址映射需求 1)IP地址难于记忆 2)能否用便于记忆的名字来映射IP地址? 2.hosts文件 1)hosts文件记录了主机名和IP地址的对应信息 2)host ...

  7. mysql explain 查询处理的结果详解

    本文转自 https://blog.csdn.net/boss_way/article/details/91416887 在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这 ...

  8. MSF权限维持

    MSF权限维持 环境搭建 目标机:win7 ip:192.168.224.133 攻击机:kali linux ip:192.168.224.129 首先使用web_delivery模块的regsvr ...

  9. 操作系统OS基础

    OS: Operating System 操作系统,通用目的的软件程序 主要功能:硬件驱动 进程管理 内存管理 网络管理 安全管理 文件管理OS分类:服务器OS:CentOS,Ubuntu,Windo ...

  10. JS错误写法[清除DOM]

    前言 我现在总结一下我之前敲代码犯的错误,清除DOM元素,我们开始写代码吧! HTML <h1 style="font-size: 18px;font-weight: bold;col ...