Pandas 是在NumPy 基础上建立的新程序库, 提供了一种高效的 DataFrame 数据结构。 DataFrame 本质上是一种带行标签和列标签、 支持相同类型数据和缺失值的多维数组。 Pandas 不仅为带各种标签的数据提供了便利的存储界面, 还实现了许多强大的操作, 这些操作对数据库框架和电子表格程序的用户来说非常熟悉。 建立在NumPy 数组结构上的 Pandas, 尤其是它的 Series 和 DataFrame 对象, 为数据科学家们处理那些消耗大量时间的“数据清理”(data munging) 任务提供了捷径。
3.2.1 Pandas的Series对象
Pandas 的 Series 对象是一个带索引数据构成的一维数组。 可以用一个数组创建 Series 对象, 如下所示
1 In[2]: data = pd.Series([0.25, 0.5, 0.75, 1.0]) 2 data 3 Out[2]: 0 0.25 4 1 0.50 5 2 0.75 6 3 1.00 7 dtype: float64
从上面的结果中, 你会发现 Series 对象将一组数据和一组索引绑定在一起, 我们可以通过 values 属性和index 属性获取数据。 values 属性返回的结果与 NumPy 数组类似:
和 NumPy 数组一样, 数据可以通过 Python 的中括号索引标签获取:
1 In[5]: data[1] 2 Out[5]: 0.5 3 In[6]: data[1:3] 4 Out[6]: 1 0.50 5 2 0.75 6 dtype: float64
3.2.2 Pandas的DataFrame对象
Pandas 的另一个基础数据结构是 DataFrame。 和上一节介绍的 Series 对象一样, DataFrame 既可以作为
一个通用型 NumPy 数组, 也可以看作特殊的 Python 字典。 下面来分别看看。
DataFrame 也有一个 index 属性可以获取索引标签:
DataFrame 还有一个 columns 属性, 是存放列标签的 Index 对象:
03. 创建DataFrame对象
Pandas 的 DataFrame 对象可以通过许多方式创建, 这里举几个常用的例子。
(1) 通过单个 Series 对象创建。 DataFrame 是一组 Series 对象的集合, 可以用单个 Series 创建一
个单列的 DataFrame:
1 In[23]: pd.DataFrame(population, columns=[‘population‘]) 2 Out[23]: population 3 California 38332521 4 Florida 19552860 5 Illinois 12882135 6 New York 19651127 7 Texas 26448193
(2) 通过字典列表创建。 任何元素是字典的列表都可以变成 DataFrame。 用一个简单的列表综合来创建
一些数据:
1 In[24]: data = [{‘a‘: i, ‘b‘: 2 * i} 2 for i in range(3)] 3 pd.DataFrame(data) 4 Out[24]: a b 5 0 0 0 6 1 1 2 7 2 2 4
(3) 通过 Series 对象字典创建。 就像之前见过的那样, DataFrame 也可以用一个由 Series 对象构成
的字典创建:
1 In[26]: pd.DataFrame({‘population‘: population, 2 ‘area‘: area}) 3 Out[26]: area population 4 California 423967 38332521 5 Florida 170312 19552860 6 Illinois 149995 12882135
(4) 通过 NumPy 二维数组创建。 假如有一个二维数组, 就可以创建一个可以指定行列索引值的
DataFrame。 如果不指定行列索引值, 那么行列默认都是整数索引值:
1 In[27]: pd.DataFrame(np.random.rand(3, 2), 2 columns=[‘foo‘, ‘bar‘], 3 index=[‘a‘, ‘b‘, ‘c‘]) 4 Out[27]: foo bar 5 a 0.865257 0.213169 6 b 0.442759 0.108267 7 c 0.047110 0.905718
(5) 通过 NumPy 结构化数组创建。 2.9 节曾介绍过结构化数组。 由于 Pandas 的 DataFrame 与结构化数
组十分相似, 因此可以通过结构化数组创建 DataFrame:
1 In[28]: A = np.zeros(3, dtype=[(‘A‘, ‘i8‘), (‘B‘, ‘f8‘)]) 2 A 3 Out[28]: array([(0, 0.0), (0, 0.0), (0, 0.0)], 4 dtype=[(‘A‘, ‘<i8‘), (‘B‘, ‘<f8‘)]) 5 In[29]: pd.DataFrame(A) 6 Out[29]: A B 7 0 0 0.0 8 1 0 0.0 9 2 0 0.0
Index 对象与 NumPy 数组之间的不同在于, Index 对象的索引是不可变的, 也就是说不能通过通常的方式进行调整:
将Series看作字典
和字典一样, Series 对象提供了键值对的映射:
将Series看作一维数组
Series 不仅有着和字典一样的接口, 而且还具备和 NumPy 数组一样的数组数据选择功能, 包括索引、 掩码、 花哨的索引等操作, 具体示例如下所示:
03. 索引器: loc、 iloc和ix
这些切片和取值的习惯用法经常会造成混乱。 例如, 如果你的 Series 是显式整数索引, 那么data[1] 这样的取值操作会使用显式索引, 而 data[1:3] 这样的切片操作却会使用隐式索引。
由于整数索引很容易造成混淆, 所以 Pandas 提供了一些索引器(indexer) 属性来作为取值的方法。它们不是 Series 对象的函数方法, 而是暴露切片接口的属性。
第一种索引器是 loc 属性, 表示取值和切片都是显式的:
1 In[14]: data.loc[1] 2 Out[14]: ‘a‘ 3 In[15]: data.loc[1:3] 4 Out[15]: 1 a 5 3 b 6 dtype: object
第二种是 iloc 属性, 表示取值和切片都是 Python 形式的 隐式索引:
1 In[16]: data.iloc[1] 2 Out[16]: ‘b‘ 3 In[17]: data.iloc[1:3] 4 Out[17]: 3 b 5 5 c 6 dtype: object
第三种取值属性是 ix, 它是前两种索引器的混合形式, 在 Series 对象中 ix 等价于标准的 [](Python 列表) 取值方式。 ix 索引器主要用于 DataFrame 对象, 后面将会介绍
Python 代码的设计原则之一是“显式优于隐式”。 使用 loc 和 iloc 可以让代码更容易维护, 可读性更高。 特别是在处理整数索引的对象时, 我强烈推荐使用这两种索引器。 它们既可以让代码阅读和理解起来更容易, 也能避免因误用索引 / 切片而产生的小 bug
表3-1: Python运算符与Pandas方法的映射关系
Python运算符 | Pandas方法 |
+ | add() |
- | sub()、 subtract() |
* | mul()、 multiply() |
/ | truediv()、 div()、 divide() |
// | floordiv() |
% | mod() |
** | pow() |
01. None: Python对象类型的缺失值
Pandas 可以使用的第一种缺失值标签是 None, 它是一个 Python 单体对象, 经常在代码中表示缺失值。 由于 None 是一个 Python 对象, 所以不能作为任何 NumPy / Pandas 数组类型的缺失值, 只能用于‘object‘ 数组类型(即由 Python 对象构成的数组) :
02. NaN: 数值类型的缺失值另一种缺失值的标签是 NaN(全称 Not a Number, 不是一个数字) , 是一种按照 IEEE 浮点数标准设计、 在任何系统中都兼容的特殊浮点数:
3.5.3 处理缺失值
我们已经知道, Pandas 基本上把 None 和 NaN 看成是可以等价交换的缺失值形式。 为了完成这种交换过程, Pandas 提供了一些方法来发现、 剔除、 替换数据结构中的缺失值, 主要包括以下几种。
isnull()
创建一个布尔类型的掩码标签缺失值。
notnull() 与 isnull() 操作相反
dropna() 返回一个剔除缺失值的数据。
fillna() 返回一个填充了缺失值的数据副本。
原文地址:https://www.cnblogs.com/BaoBobbyZhang/p/12146949.html