Pandas 快速入门(二)
本文的例子需要一些特殊设置,具体可以参考 Pandas快速入门(一)
数据清理和转换
我们在进行数据处理时,拿到的数据可能不符合我们的要求。有很多种情况,包括部分数据缺失,一些数据的格式不正确,一些数据的标注问题等等。对于这些数据,我们在开始分析之前必须进行必要的整理、清理。
清理和转换的过程中用到最对的包括判断是否存在空值(obj.isnull),删除空值(dropna)、填充空值(fillna)、大小写转换、文字替换(replace)等等。我这里挑几个典型的场景来学习一下。
判断是否存在有空值的行,并删除行
先构建一个具有空值的DataFrame对象。
In [17]: stat = DataFrame.from_dict({"Beijing":{"People":3100,"Area":540,"GDP":3000},"Guangzhou":{"People":np.nan,"Area":370,"GDP":2500},"Shanghai":
...: {"People":2800,"Area":500,"GDP":3100},"Shenzhen":{"People":1800,"Area":np.nan,"GDP":2100}},orient='index')
In [18]: stat
Out[18]:
People Area GDP
Beijing 3100.0 540.0 3000
Guangzhou NaN 370.0 2500
Shanghai 2800.0 500.0 3100
Shenzhen 1800.0 NaN 2100
In [20]: stat.isnull()
Out[20]:
People Area GDP
Beijing False False False
Guangzhou True False False
Shanghai False False False
Shenzhen False True False
In [24]: stat = stat.dropna()
In [25]: stat
Out[25]:
People Area GDP
Beijing 3100.0 540.0 3000
Shanghai 2800.0 500.0 3100
这样就把包含空值的行全部删除了。
对标签数据进行规范化转换,对数据进行替换
本例的目的是,数据中存在一些语义标签表达不规范,按照规范的方式进行统一修改并进行替换。例如,根据Gender规范人员的称呼,对职业进行规范。
In [26]: people = DataFrame.from_dict(
...: {"Xiao Zhang":{"Gender":"Male","Age":24,"Occupation":"小学老师"},
...: "xiao Wang":{"Gender":"Female","Age":25,"Occupation":"大学老师"},
...: "Xiao Wei":{"Gender":"Male","Age":23,"Occupation":"百度公司"},
...: "Lao Shi":{"Gender":"Female","Age":55,"Occupation":"阿里巴巴"}},
...: orient='index')
...:
In [27]: people
Out[27]:
Gender Age Occupation
Lao Shi Female 55 阿里巴巴
Xiao Wei Male 23 百度公司
Xiao Zhang Male 24 小学老师
xiao Wang Female 25 大学老师
第一个需求,就是把职业一栏,规范为“教师”、“公司职员”。
In [28]: map = {
...: "小学老师" : "教师",
...: "大学老师" : "教师",
...: "百度公司" : "公司职员",
...: "阿里巴巴" : "公司职员"
...: }
In [29]: map
Out[29]: {'大学老师': '教师', '小学老师': '教师', '百度公司': '公司职员', '阿里巴巴': '公司职员'}
In [30]: people.replace(map)
Out[30]:
Gender Age Occupation
Lao Shi Female 55 公司职员
Xiao Wei Male 23 公司职员
Xiao Zhang Male 24 教师
xiao Wang Female 25 教师
另一个需求,根据Gender增加一列称谓。这里就不考虑已婚未婚了。
In [34]: def NormalizeName(gender):
...: if( gender == "Male"):
...: return "Mr "
...: elif( gender == "Female" ):
...: return "Mrs "
...:
In [40]: people['title'] = people['Gender'].map(NormalizeName)
In [43]: people
Out[43]:
Gender Age Occupation title
Lao Shi Female 55 公司职员 Mrs
Xiao Wei Male 23 公司职员 Mr
Xiao Zhang Male 24 教师 Mr
xiao Wang Female 25 教师 Mrs
对于数据量大的情况,有时候不能够在分析之前就发现数据中存在的问题,往往是分析进行到一半,突然发现有的数据格式或者质量有问题,对于这种情况,不知道大家有没有好的处理办法,让我们提前发现数据问题?
时间序列
日期和时间数据类型
处理时间数据,经常用到Python中的 datetime 模块,该模块中的主要数据类型有。
| 类型 | 说明 |
|---|---|
| date | 以公历形式存储日历日期(年、月、日) |
| time | 将时间存储为时、分、秒、毫秒 |
| datetime | 存储日期和时间 |
| timedelta | 表示两个datetime值之间的差(日、秒、毫秒) |
与时间序列相关的还有很多功能,包括时区转换。如果是从文件读入的数据,可以使用 parse_dates参数来对日期进行解析。
对于日期型的索引,可以根据日期、月份、年份、日期范围来方便的选择数据。
In [131]: jgd['2017-03':'2017-04']
Out[131]:
摘要 证券名称 合同编号 成交数量 成交均价 成交金额 手续费 \
成交日期
2017-03-01 申购配号 拉芳配号 13932 1 0.0 0.0 0.0
2017-03-01 申购配号 康隆配号 13933 1 0.0 0.0 0.0
使用 to_period 和 asfreq 方法,可以方便的将日期转换成按月、按季度、按工作日显示的索引,方便进行后续的统计汇总。我
画图
DataFrame对象自带一个 plot 方法,可以进行方便的绘图。
In [143]: jgd['成交金额'].resample('M').sum()
Out[143]:
成交日期
2017-01-31 12693.80
2017-02-28 12863.00
2017-03-31 150605.00
2017-04-30 546912.00
2017-05-31 199024.57
2017-06-30 381675.01
2017-07-31 772297.30
2017-08-31 1176152.20
2017-09-30 1328378.00
2017-10-31 1183852.00
2017-11-30 1151724.65
2017-12-31 36120.00
Freq: M, Name: 成交金额, dtype: float64
n [145]: jgd['成交金额'].resample('M').sum().plot()
Out[145]: <matplotlib.axes._subplots.AxesSubplot at 0x10cc78080>
如下图:

分组统计
对于分组统计,通常的步骤是“分割、应用(统计函数)、合并”。
Groupby 是Pandas中最常用的分组函数,返回一个 DataFrameGroupBy 对象,该对象实际并不包含数据内容,记录了中间数据,当我们对分组数据进行数学运算时,pandas 再根据对象内的信息对 DataFrame 进行快速分块运算并返回结果。
1、根据某个字段分组并求和
In [171]: jgd.columns
Out[171]:
Index(['摘要', '证券名称', '合同编号', '成交数量', '成交均价', '成交金额', '手续费', '印花税', '其他杂费',
'发生金额', '股东帐户', '备注', '操作', '证券代码', '结算汇率', 'Unnamed: 16'],
dtype='object')
In [172]: jgd_g1 = jgd.groupby(['证券名称','摘要'])
In [173]: jgd_g1.sum()
Out[173]:
成交数量 成交金额
证券名称 摘要
50ETF 证券买入 500 1228.00
证券卖出 -1300 3190.20
透视表 pivot_table
pivot_table 函数提供了一个生成 Excel 样式透视表的方法。调用格式pd.pivot_table(data,values,index,columns,aggfunc)。
- data : 需要处理的 DataFrame 对象
- values : 一个或一组需要分组的列名
- index : a column, Grouper, array which has the same length as data, or list of them. Keys to group by on the pivot table index. If an array is passed, it is being used as the same manner as column values.
- columns : a column, Grouper, array which has the same length as data, or list of them. Keys to group by on the pivot table column. If an array is passed, it is being used as the same manner as column values.
- aggfunc : function to use for aggregation, defaulting to numpy.mean.
导入和导出数据
从CSV导入数据
In [72]: jg = pd.read_csv('jg-2017-12-utf8.csv',parse_dates=True,index_col=0)
In [73]: jg
Out[73]:
摘要 证券名称 合同编号 成交数量 成交均价 成交金额 手续费 印花税 其他杂费 \
成交日期
2017-12-01 基金资金拨出 天天发1 0 0 1.000 0 0.00 0.00 0.00
2017-12-01 证券卖出 民丰特纸 8471 -1000 7.120 7120 5.00 7.12 0.14
将数据写入到CSV中
In [82]: del jg['结算汇率']
In [84]: jg.to_csv('test.csv')
In [90]: cat test.csv
成交日期,摘要,证券名称,合同编号,成交数量,成交均价,成交金额,手续费,印花税,其他杂费,发生金额,股东帐户,备注,操作,证券代码
2017-12-01,基金资金拨出,天天发1,0,0,1.0,0,0.0,0.0,0.0,-36118.59,99F6983257,122.0,其他,940018
参考资料
1、利用Pandas进行数据分析
2、十分钟搞定pandas
3、Pandas Documentation
4、DataFrame Replace
5、
Pandas 快速入门(二)的更多相关文章
- Python pandas快速入门
Python pandas快速入门2017年03月14日 17:17:52 青盏 阅读数:14292 标签: python numpy 数据分析 更多 个人分类: machine learning 来 ...
- pandas快速入门
pandas快速入门 numpy之后让我们紧接着学习pandas.Pandas最初被作为金融数据分析工具而开发出来,后来因为其强大性以及友好性,在数据分析领域被广泛使用,下面让我们一窥究竟. 本文参考 ...
- python3.5+django2.0快速入门(二)
昨天写了python3.5+django2.0快速入门(一)今天将讲解配置数据库,创建模型,还有admin的后台管理. 配置数据库 我们打开mysite/mysite/settings.py这个文件. ...
- Pandas快速入门笔记
我正以Python作为突破口,入门机器学习相关知识.出于机器学习实践过程中的需要,我快速了解了一下提供了类似关系型或标签型数据结构的Pandas的使用方法.下面记录相关学习笔记. 数据结构 Panda ...
- Pandas快速入门(一)
快速使用 bogon:Documents rousseau$ ipython --pylab Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23 ...
- Pandas快速入门(深度学习入门2)
源地址为:http://pandas.pydata.org/pandas-docs/stable/10min.html#min Pandas(Python Data Analysis Library) ...
- Linux Bash Shell快速入门 (二)
BASH 中的变量介绍BASH 中的变量都是不能含有保留字,不能含有 "-" 等保留字符,也不能含有空格. 简单变量在 BASH 中变量定义是不需要的,没有 "int i ...
- Mysql快速入门(二)
多表关联查询 JOIN 按照功能大致分为如下三类: CROSS JOIN(交叉连接) INNER JOIN(内连接或等值连接). OUTER JOIN(外连接) 交叉连接 交叉连接的关键字:CROSS ...
- Ant快速入门(二)-----使用Ant工具
使用Ant非常简单,当正确安装Ant后,只要输入ant或ant.bat即可. 如果运行ant命令时没有指定任何参数,Ant会在当前目录下搜索build.xml文件.如果找到了就以该文件作为生成文件,并 ...
随机推荐
- AndroidManifest.xml配置文件详解 (转)
原文:http://blog.csdn.net/shagoo/article/details/7485958# AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的 ...
- linux操作系统语言更改
有时候我们的服务器在安装时安装的默认语言不支持中文,导致程序.文档中的汉子显示乱码,从而使系统报一些莫名其妙的错误,这是可以更改操作系统的默认语言 1.echo $LANG 查看当前操作系统的语 ...
- 家庭房产L2-007
较为麻烦的并查集 主要是我的模板是错的检查了好久.... 先是输入 把每个家庭连在一起 输出的家庭编号为该家庭所有编号的最小值 在并查集里面完成 第一次 0~n-1遍历储存好 家庭编号 和房子面积和 ...
- H5的简介
1.H5的诞生 2.介绍 HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML5 是 W3C 与 WHATWG 合作的结果. WHATWG 致力于 web 表单和应用 ...
- ubuntu下hadoop,spark配置
转载来自:http://www.cnblogs.com/spark-china/p/3941878.html 在VMWare 中准备第二.第三台运行Ubuntu系统的机器: 在VMWare中构建第 ...
- Git 版本控制管理(一)
Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介绍 Git —— The stupid content tracker(傻瓜式的内容跟踪器) 关于 Git 的 ...
- python基础下的数据结构与算法之顺序表
一.什么是顺序表: 线性表的两种基本的实现模型: 1.将表中元素顺序地存放在一大块连续的存储区里,这样实现的表称为顺序表(或连续表).在这种实现中,元素间的顺序关系由它们的存储顺序自然表示. 2.将表 ...
- Spring-Session实现Session共享入门教程
任何一种技术的出现,都是来解决特定的问题的! 本篇开始学习Spring-Session相关的一些知识学习整理,让我们开始吧! Spring-Session介绍 Spring-Session使用的场景? ...
- 【WIN10】WIN2D——圖像處理
源碼下載:http://yunpan.cn/c3iNuHFFAcr8h 访问密码 8e48 還是先來看下截圖: 實現了幾個效果:放大.縮小.旋轉.左右翻轉.上下翻轉,亮度變化.灰度圖.對比度.高斯模 ...
- 得到某个android应用 的POST和GET请求的 网址和参数
两种思路: 1.用笔记本建个wifi热点,然后抓包. 2. 把APK装到模拟器上 会在任务管理中有个exe进程,用一个软件可以抓取这个进程的所有请求 .