Pandas数据处理一

Pandas 是在NumPy 基础上建立的新程序库, 提供了一种高效的 DataFrame 数据结构。 DataFrame 本质上是一种带行标签和列标签、 支持相同类型数据和缺失值的多维数组。 Pandas 不仅为带各种标签的数据提供了便利的存储界面, 还实现了许多强大的操作, 这些操作对数据库框架和电子表格程序的用户来说非常熟悉。 建立在NumPy 数组结构上的 Pandas, 尤其是它的 Series DataFrame 对象, 为数据科学家们处理那些消耗大量时间的数据清理data munging) 任务提供了捷径。
3.2.1 PandasSeries对象
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 PandasDataFrame对象
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. 索引器: locilocix
这些切片和取值的习惯用法经常会造成混乱。 例如, 如果你的 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-1Python运算符与Pandas方法的映射关系

Python运算符 Pandas方法
+ add()
- sub()subtract()
* mul()multiply()
/ truediv()div()divide()
// floordiv()
% mod()
** pow()



01. NonePython对象类型的缺失值
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() 返回一个填充了缺失值的数据副本。




猜你喜欢

转载自www.cnblogs.com/BaoBobbyZhang/p/12146949.html