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. 用composer安装captcha_src()不成功

    1,要么就是TP的框架配置有问题建议重新下载 2,要么就是下载captcha_src的语句有问题  正确的语句  composer require topthink/think-captcha 1.* ...

  2. install Wine + WeChat in Fedora 31

    install Wine + WeChat in Fedora 31 dnf -y install dnf-plugins-core dnf config-manager --add-repo htt ...

  3. Redis安装使用以及可能的算法实践

    layout: post title: 2017-12-05-Redis 入门 tags: - Redis - 实时特征 - UCB, Tompson sampling Redis 是什么? Redi ...

  4. volatile、ThreadLocal的使用场景和原理

    并发编程中的三个概念 原子性 一个或多个操作.要么全部执行完成并且执行过程不会被打断,要么不执行.最常见的例子:i++/i--操作.不是原子性操作,如果不做好同步性就容易造成线程安全问题. 可见性 多 ...

  5. activiti 流程部署 保存流程图到数据库 保存二进制图片 存储失败

    activiti 流程部署 保存流程图到数据库  保存二进制图片 存储失败 具体错误如下 具体 junit测试 结果 :提示如下: 解决方法: 数据库版本不同 无法保存二进制文件到数据库表中!5.5. ...

  6. 使用composer 显示错误美化

    新建comoser.json { "name": "brady_frmwork", "description":"php fram ...

  7. win10下使用命令行安装配置appium环境

    安装列表 安卓sdk目录,即ANDROID_HOME设置 关于sdk的安装配置此处略,参考之前文章<Appium+Java(一) Windows环境搭建篇> node运行环境 appium ...

  8. MySQL5.6的二进制安装

    5.6 5.7 用的最多 差别不大. 首先从网上下在二进制文件 先去官网找到自己想要的版本 https://dev.mysql.com/downloads/mysql/ https://dev.mys ...

  9. centos 8 集群Linux环境搭建

    一.集群Linux环境搭建 1. 注意事项 1.1 windows系统确认所有的关于VmWare的服务都已经启动 打开任务管理器->服务,查看五个VM选项是否打开. 1.2 确认好VmWare生 ...

  10. CSS中-moz、-ms、-webkit、-o的意思

    -moz代表firefox浏览器私有属性 -ms代表ie浏览器私有属性 -webkit代表safari.chrome浏览器私有属性 -o代表opera浏览器私有属性 上述这些是为了兼容老版本的写法: