【学习笔记】 第05章 pandas入门
前言
上一篇学习中学成的随笔是我的第一篇随笔,撰写中有颇多不足,比如事无巨细的写入学习过程反而像是在抄书,失去了很多可读性也不利于自己反过头来复习,本章节学习需要多加注意,尽量写下较为关键的内容,犯下的错误,难以理解的概念等等
pandas含有使数据清洗和分析工作变得更快更简单的数据结构和操作工具。pandas经常和其它工具一同使用,如数值计算工具NumPy和SciPy,分析库statsmodels和scikit-learn,和数据可视化库matplotlib。pandas是基于NumPy数组构建的,特别是基于数组的函数和不使用for循环的数据处理。
虽然pandas采用了大量的NumPy编码风格,但二者最大的不同是pandas是专门为处理表格和混杂数据设计的。而NumPy更适合处理统一的数值数组数据。
pandas的数据结构介绍
Series和DataFrame
Series
Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。
这里可以通过Series 的values和index属性获取其数组表示形式和索引对象
In [13]: obj.values
Out[13]: array([ 4, 7, -5, 3])
In [14]: obj.index # like range(4)
Out[14]: RangeIndex(start=0, stop=4, step=1)
如果需要所创建的Series带有一个可以对各个数据点进行标记的索引,则
obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
即可
与普通NumPy数组相比,你可以通过索引的方式选取Series中的单个或一组值,而使用NumPy函数或类似NumPy的运算(如根据布尔型数组进行过滤、标量乘法、应用数学函数等)都会保留索引值的链接
如果数据被存放在一个Python字典中,也可以直接通过这个字典来创建Series:
In [26]: sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
In [27]: obj3 = pd.Series(sdata)
而如果传入一个字典,该字典与series值无法一一对应(缺少对应),则该位置结果会变成NaN(非数字)
pandas的isnull和notnull函数可用于检测缺失数据
对于许多应用而言,Series最重要的一个功能是,它会根据运算的索引标签自动对齐数据,和数据库的join操作类似
serie有一个name属性,可以为数据和数据项起名
In [38]: obj4.name = 'population'
In [39]: obj4.index.name = 'state'
In [40]: obj4
Out[40]:
state
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
Name: population, dtype: float64
series的索引可以通过赋值的方式就地修改
DataFrame
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)。
建DataFrame的办法有很多,最常用的一种是直接传入一个由等长列表或NumPy数组组成的字
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
其中,panda里的head方法会选取前五行
如果指定了列序列,则DataFrame的列就会按照指定顺序进行排列
如果传入的列在数据中找不到,就会在结果中产生缺失值
通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series
…………(把所有代码均进行了实现)
In [9]: data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
...: 'year': [2000, 2001, 2002, 2001, 2002, 2003],
...: 'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
In [10]: frame = pd.DataFrame(data)
In [11]: frame
Out[11]:
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
5 Nevada 2003 3.2
In [12]: pd.DataFrame(data, columns=['year', 'state', 'pop'])
Out[12]:
year state pop
0 2000 Ohio 1.5
1 2001 Ohio 1.7
2 2002 Ohio 3.6
3 2001 Nevada 2.4
4 2002 Nevada 2.9
5 2003 Nevada 3.2
In [13]: frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
...: ....: index=['one', 'two', 'three', 'four',
...: ....: 'five', 'six'])
In [14]: frame2
Out[14]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
six 2003 Nevada 3.2 NaN
In [15]: frame2.state
Out[15]:
one Ohio
two Ohio
three Ohio
four Nevada
five Nevada
six Nevada
Name: state, dtype: object
In [16]: frame2.debt=16.5
In [17]: frame2
Out[17]:
year state pop debt
one 2000 Ohio 1.5 16.5
two 2001 Ohio 1.7 16.5
three 2002 Ohio 3.6 16.5
four 2001 Nevada 2.4 16.5
five 2002 Nevada 2.9 16.5
six 2003 Nevada 3.2 16.5
In [18]: frame2['debt'] = np.arange(6.)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-18-f6c7820e8a60> in <module>
----> 1 frame2['debt'] = np.arange(6.)
NameError: name 'np' is not defined
In [19]: import numpy as np
In [20]: frame2['debt'] = np.arange(6.)
In [21]: frame2
Out[21]:
year state pop debt
one 2000 Ohio 1.5 0.0
two 2001 Ohio 1.7 1.0
three 2002 Ohio 3.6 2.0
four 2001 Nevada 2.4 3.0
five 2002 Nevada 2.9 4.0
six 2003 Nevada 3.2 5.0
In [22]: frame2['eastern'] = frame2.state == 'Ohio'
In [23]: frame2
Out[23]:
year state pop debt eastern
one 2000 Ohio 1.5 0.0 True
two 2001 Ohio 1.7 1.0 True
three 2002 Ohio 3.6 2.0 True
four 2001 Nevada 2.4 3.0 False
five 2002 Nevada 2.9 4.0 False
six 2003 Nevada 3.2 5.0 False
In [24]: del frame2['eastern']
In [25]: frame2
Out[25]:
year state pop debt
one 2000 Ohio 1.5 0.0
two 2001 Ohio 1.7 1.0
three 2002 Ohio 3.6 2.0
four 2001 Nevada 2.4 3.0
five 2002 Nevada 2.9 4.0
six 2003 Nevada 3.2 5.0
In [26]: pop = {'Nevada': {2001: 2.4, 2002: 2.9},
...: ....: 'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
In [27]: frame3 = pd.DataFrame(pop)
In [28]: frame3
Out[28]:
Nevada Ohio
2001 2.4 1.7
2002 2.9 3.6
2000 NaN 1.5

索引对象
不可变的属性,可以使index在不同的数据结构之间共享

基本功能
重新索引

丢弃指定轴上的项
丢弃某条轴上的一个或多个项很简单,只要有一个索引数组或列表即可。由于需要执行一些数据整理和集合逻辑,所以drop方法返回的是一个在指定轴上删除了指定值的新对象
索引、选取和过滤
利用标签的切片运算与普通的Python切片运算不同,其末端是包含的
In [125]: obj['b':'c']
Out[125]:
b 1.0
c 2.0
dtype: float64
学习了以下代码
In [82]: data[:2]
Out[82]:
one two three four
Ohio 0 1 2 3
Colorado 4 5 6 7
In [83]: data
Out[83]:
one two three four
Ohio 0 1 2 3
Colorado 4 5 6 7
Utah 8 9 10 11
New York 12 13 14 15
In [84]: data[data['three'] > 5]
Out[84]:
one two three four
Colorado 4 5 6 7
Utah 8 9 10 11
New York 12 13 14 15
In [85]: data < 5
Out[85]:
one two three four
Ohio True True True True
Colorado True False False False
Utah False False False False
New York False False False False
In [86]: data[data < 5] = 0
In [87]: data
Out[87]:
one two three four
Ohio 0 0 0 0
Colorado 0 5 6 7
Utah 8 9 10 11
New York 12 13 14 15
用loc和iloc进行选取
对于DataFrame的行的标签索引,我引入了特殊的标签运算符loc和iloc。它们可以让你用类似NumPy的标记,使用轴标签(loc)或整数索引(iloc),从DataFrame选择行和列的子集

整数索引
由于歧义问题,
In [93]: ser = pd.Series(np.arange(3.))
In [94]: ser
Out[94]:
0 0.0
1 1.0
2 2.0
dtype: float64
In [95]: ser[-1]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexes\range.py in get_loc(self, key, method, tolerance)
384 try:
--> 385 return self._range.index(new_key)
386 except ValueError as err:
ValueError: -1 is not in range
The above exception was the direct cause of the following exception:
KeyError Traceback (most recent call last)
<ipython-input-95-44969a759c20> in <module>
----> 1 ser[-1]
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\series.py in __getitem__(self, key)
940
941 elif key_is_scalar:
--> 942 return self._get_value(key)
943
944 if is_hashable(key):
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\series.py in _get_value(self, label, takeable)
1049
1050 # Similar to Index.get_value, but we do not fall back to positional
-> 1051 loc = self.index.get_loc(label)
1052 return self.index._get_values_for_loc(self, loc, label)
1053
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexes\range.py in get_loc(self, key, method, tolerance)
385 return self._range.index(new_key)
386 except ValueError as err:
--> 387 raise KeyError(key) from err
388 raise KeyError(key)
389 return super().get_loc(key, method=method, tolerance=tolerance)
KeyError: -1
对于非整数索引,不会产生歧义,为了进行统一,如果轴索引含有整数,数据选取总会使用标签。为了更准确,请使用loc(标签)或iloc(整数)
(本人实验认证,浮点型也会产生歧义)
算术运算和数据对齐
pandas最重要的一个功能是,它可以对不同索引的对象进行算术运算。在将对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集。对于有数据库经验的用户,这就像在索引标签上进行自动外连接
在两个数据相加时自动的数据对齐操作在不重叠的索引处引入了NA值。缺失值会在算术运算过程中传播
对于DataFrame,对齐操作会同时发生在行和列上
In [127]: df1 = pd.DataFrame(np.arange(9.).reshape((3, 3)), columns=list('bcd'),
...: .....: index=['Ohio', 'Texas', 'Colorado'])
In [128]: df2 = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'),
...: .....: index=['Utah', 'Ohio', 'Texas', 'Oregon'])
In [129]: df1
Out[129]:
b c d
Ohio 0.0 1.0 2.0
Texas 3.0 4.0 5.0
Colorado 6.0 7.0 8.0
In [130]: df2
Out[130]:
b d e
Utah 0.0 1.0 2.0
Ohio 3.0 4.0 5.0
Texas 6.0 7.0 8.0
Oregon 9.0 10.0 11.0
In [131]: df1+df2
Out[131]:
b c d e
Colorado NaN NaN NaN NaN
Ohio 3.0 NaN 6.0 NaN
Oregon NaN NaN NaN NaN
Texas 9.0 NaN 12.0 NaN
Utah NaN NaN NaN NaN
在算术方法中填充值
可以使用df1的add方法,传入df2以及一个fill_value参数,这样会把缺失的值默认为0进行累加

DataFrame和Series之间的运算
当我们从arr减去arr[1],每一行都会执行这个操作。这就叫做广播(broadcasting)
In [136]: arr = np.arange(12.).reshape((3, 4))
In [137]: arr
Out[137]:
array([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]])
In [138]: arr[1]
Out[138]: array([4., 5., 6., 7.])
In [139]: arr-arr[1]
Out[139]:
array([[-4., -4., -4., -4.],
[ 0., 0., 0., 0.],
[ 4., 4., 4., 4.]])
函数应用和映射
NumPy的ufuncs(元素级数组方法)也可用于操作pandas对象
In [190]: frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'),
.....: index=['Utah', 'Ohio', 'Texas', 'Oregon'])
In [191]: frame
Out[191]:
b d e
Utah -0.204708 0.478943 -0.519439
Ohio -0.555730 1.965781 1.393406
Texas 0.092908 0.281746 0.769023
Oregon 1.246435 1.007189 -1.296221
In [192]: np.abs(frame)
Out[192]:
b d e
Utah 0.204708 0.478943 0.519439
Ohio 0.555730 1.965781 1.393406
Texas 0.092908 0.281746 0.769023
Oregon 1.246435 1.007189 1.296221
这里写入代码是为了说明其中(np.random.randn(4, 3))意思是创造一组4*3的矩阵,里面数据具有标准正态分布
而
In [193]: f = lambda x: x.max() - x.min()
In [194]: frame.apply(f)
Out[194]:
b 1.802165
d 1.684034
e 2.689627
dtype: float64
这里lambda是个匿名函数
In [195]: frame.apply(f, axis='columns')
Out[195]:
Utah 0.998382
Ohio 2.521511
Texas 0.676115
Oregon 2.542656
dtype: float64
这里的axis='columns'是为了告诉计算机我选择行了而非列
排序和排名
根据条件对数据集排序(sorting)也是一种重要的内置运算。要对行或列索引进行排序(按字典顺序),可使用sort_index方法,它将返回一个已排序的新对象
对于DataFrame,则可以根据任意一个轴上的索引进行排序
数据默认是按升序排序的,但也可以降序排序:
frame.sort_index(axis=1, ascending=False)
若要按值对Series进行排序,可使用其sort_values方法,在排序时,任何缺失值默认都会被放到Series的末尾
当排序一个DataFrame时,你可能希望根据一个或多个列中的值进行排序。将一个或多个列的名字传递给sort_values的by选项即可达到该目的
In [163]: frame = pd.DataFrame({'b': [4, 7, -3, 2], 'a': [0, 1, 0, 1]})
In [164]: frame
Out[164]:
b a
0 4 0
1 7 1
2 -3 0
3 2 1
In [165]: frame.sort_values(by='b')
Out[165]:
b a
2 -3 0
3 2 1
0 4 0
1 7 1
带有重复标签的轴索引
对于带有重复值的索引,数据选取的行为将会有些不同。如果某个索引对应多个值,则返回一个Series;而对应单个值的,则返回一个标量值
这样会使代码变复杂,因为索引的输出类型会根据标签是否有重复发生变化。
对DataFrame的行进行索引时也是如此
汇总和计算描述统计
(终于肝到这里,中间没忍住刷了好几次B站)


相关系数与协方差
有些汇总统计(如相关系数和协方差)是通过参数对计算出来的。书中的几个DataFrame,它们的数据来自Yahoo!Finance的股票价格和成交量,使用的是pandas-datareader包(可以用conda或pip安装)
conda install pandas-datareader
书中使用pandas_datareader模块下载了一些股票数据,可惜书中使用的网站是雅虎,雅虎现在已经凉了,所以暂时没有合适的数据,只好硬啃,相关内容都是概率论中各个理论的实现,除了介绍不同的方法以外,并没有新的东西
唯一值、值计数以及成员资格
还有一类方法可以从一维Series的值中抽取信息。

有时,你可能希望得到DataFrame中多个相关列的一张柱状图。
In [20]: data = pd.DataFrame({'Qu1': [1, 3, 4, 3, 4],
...: .....: 'Qu2': [2, 3, 1, 2, 3],
...: .....: 'Qu3': [1, 5, 2, 4, 4]})
In [21]: data
Out[21]:
Qu1 Qu2 Qu3
0 1 2 1
1 3 3 5
2 4 1 2
3 3 2 4
4 4 3 4
In [22]: result = data.apply(pd.value_counts).fillna(0)
In [23]: result
Out[23]:
Qu1 Qu2 Qu3
1 1.0 1.0 1.0
2 0.0 2.0 1.0
3 2.0 2.0 0.0
4 2.0 0.0 2.0
5 0.0 0.0 1.0
这里,结果中的行标签是所有列的唯一值。后面的频率值是每个列中这些值的相应计数
小结
书中内容:
在下一章,我们将讨论用pandas读取(或加载)和写入数据集的工具。
之后,我们将更深入地研究使用pandas进行数据清洗、规整、分析和可视化工具。
通过学习numpy和pandas一些基础应用,了解到Numpy实际上是数值计算的扩展包,它能高效处理N维数组,复杂函数,线性代数.而Panadas是做数据处理,是python的一个数据分析包。同时更深刻了解了一些重要模块的使用,在不同库下调用的区别
明天继续努力!
【学习笔记】 第05章 pandas入门的更多相关文章
- 《利用python进行数据分析》读书笔记--第五章 pandas入门
http://www.cnblogs.com/batteryhp/p/5006274.html pandas是本书后续内容的首选库.pandas可以满足以下需求: 具备按轴自动或显式数据对齐功能的数据 ...
- [HeadFist-HTMLCSS学习笔记][第七章CSS入门:加一点样式]
CSS入门 style元素设置CSS 基本格式 <style type="text/css"> body { background-color: #eaf3da; } ...
- 《利用Python进行数据分析》笔记---第5章pandas入门
写在前面的话: 实例中的所有数据都是在GitHub上下载的,打包下载即可. 地址是:http://github.com/pydata/pydata-book 还有一定要说明的: 我使用的是Python ...
- 《第一本Docker书》学习笔记——第3章 Docker入门
3.1 确保Docker已经就绪 查看docker是否正常工作: sudo docker info 3.2 运行我们的第一个容器 现在,让我们尝试启动第一个Docker容器.我们可以使用docker ...
- < 利用Python进行数据分析 - 第2版 > 第五章 pandas入门 读书笔记
<利用Python进行数据分析·第2版>第五章 pandas入门--基础对象.操作.规则 python引用.浅拷贝.深拷贝 / 视图.副本 视图=引用 副本=浅拷贝/深拷贝 浅拷贝/深拷贝 ...
- java JDK8 学习笔记——第16章 整合数据库
第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...
- Stealth视频教程学习笔记(第二章)
Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...
- Stealth视频教程学习笔记(第一章)
Stealth视频教程学习笔记(第一章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...
- jQuery学习笔记(一):入门
jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操 ...
随机推荐
- 使用纯 CSS 实现超酷炫的粘性气泡效果
最近,在 CodePen 上看到这样一个非常有意思的效果: 这个效果的核心难点在于气泡的一种特殊融合效果. 其源代码在:CodePen Demo -- Goey footer,作者主要使用的是 SVG ...
- Python实现哈希表(分离链接法)
一.python实现哈希表 只使用list,构建简单的哈希表(字典对象) # 不使用字典构造的分离连接法版哈希表 class HashList(): """ Simple ...
- intellidea 快捷键-*01
快捷键: 0.竖向选择文本: alt+shift+insert:https://www.cnblogs.com/JonaLin/p/11422110.html 如果想修改快捷键(setting-> ...
- 温控器/胎压检测/电表/热泵显示控制器等,低功耗高抗干扰断/段码(字段式)LCD液晶显示驱动IC-VK2C22A/B,替代市面16C22,44*4/40*4点显示
产品品牌:永嘉微电/VINKA 产品型号:VK2C22A/B 封装形式:LQFP52/48 产品年份:新年份 概述: VK2C22是一个点阵式存储映射的LCD驱动器,可支持最大176点(44SEGx4 ...
- Dubbo源码(三) - 服务导出(生产者)
前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 在了解了Dubbo SPI后,我们来了解下Dubbo服务导出的过程. Dubbo的配置是通过Du ...
- WSL2安装Ubuntu20.04
前言:听说WSL2需要Window版本在1904以上(我的window版本是1909,所以未能验证真实性) 启用WSL 控制面板 → 程序 → 程序和功能 → 启用或关闭Windows功能 勾选 适用 ...
- Mysql 数据恢复流程 基于binlog redolog undolog
注:文中有个易混淆的地方 sql事务,即每次数据库操作生成的事务,这个事务trx_id只在undolog里存储,同时undolog维护了此事务是否完成的状态. 日志持久化事务,为了保证redolog和 ...
- ML.NET相关资源整理
在人工智能领域,无论是机器学习,还是深度学习等,Python编程语言都是绝对的主流,尽管底层都是C++实现的,似乎人工智能和C#/F#编程语言没什么关系.在人工智能的工程实现,通常都是将Pytho ...
- 无意苦争春,一任群芳妒!M1 Mac book(Apple Silicon)能否支撑全栈工程师的日常?(Python3/虚拟机/Docker/Redis)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_187 就像大航海时代里突然诞生的航空母舰一样,苹果把玩着手心里远超时代的M1芯片,微笑着对Intel说:"不好意思,虽然 ...
- 小白之Python基础(三)
列表和元组 1.列表:最常用的 Python 数据类型(可变的数据类型) 1)列表是一个值,它包含多个值构成的序列: 2)通过[ ]或list()创建的有序元素的集合: 3)表项(列表中的值,也可以叫 ...