前言
地位:pandas是Python进行数据分析必不可少的一个包,要不要学你自己看着办吧
如何学习:先随着小编看一下几个重要的函数方法,然后用实例加以巩固
预备知识:NumPy数组是一个多维数组对象,称为ndarray。其由两部分组成:实际的数据、描述这些数据的元数据
此外小编为你准备了:Python系列
开始使用pandas,你需要熟悉它的两个重要的数据结构:
Series:是一个值的序列,它只有一个列,以及索引。
DataFrame:是有多个列的数据表,每个列拥有一个 label,当然,DataFrame 也有索引。
首先我们导入包:
In [1]: from pandas import Series, DataFrame In [2]: import pandas as pd
下面我们将详细介绍Series、DataFrame这俩个部分
一、Series
Series是一个一维的类似的数组对象,包含一个数组的数据(任何NumPy的数据类型)和一个与数组关联的数据标签,被叫做 索引 。最简单的Series是由一个数组的数据构成:
In [3]: obj = Series([4, 7, -5, 3]) In [4]: obj Out[4]: 0 4 1 7 2 -5 3 3 dtype: int64
通常,需要创建一个带有索引来确定没一个数据点的Series:
In [5]: obj2 = Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c']) In [6]: obj2 Out[6]: d 4 b 7 a -5 c 3 dtype: int64 In [7]: obj2.index Out[7]: Index(['d', 'b', 'a', 'c'], dtype='object')
与正规的NumPy数组相比,你可以使用索引里的值来选择一个单一值或一个值集:
In [8]: obj2['a'] Out[8]: -5 In [9]: obj2['d'] = 6 In [10]: obj2[['c', 'a', 'd']] Out[10]: c 3 a -5 d 6 dtype: int64
我们也可以对Series进行一些处理,然后,再进行输出:
In [11]: obj2 Out[11]: d 6 b 7 a -5 c 3 dtype: int64 In [12]: obj2[obj2 > 0] Out[12]: d 6 b 7 c 3 dtype: int64 In [13]: obj2 * 2 Out[13]: d 12 b 14 a -10 c 6 dtype: int64
另一种思考的方式是,Series是一个定长的,有序的字典,因为它把索引和值映射起来了。它可以适用于许多期望一个字典的函数:
In [14]: 'b' in obj2 Out[14]: True In [15]: 'e' in obj2 Out[15]: False
如果你有一些数据在一个Python字典中,你可以通过传递字典来从这些数据创建一个Series:
In [16]: sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000} In [17]: obj3 = Series(sdata) In [18]: obj3 Out[18]: Ohio 35000 Oregon 16000 Texas 71000 Utah 5000 dtype: int64
只传递一个字典的时候,结果Series中的索引将是排序后的字典的键:
In [19]: states = ['California', 'Ohio', 'Oregon', 'Texas'] In [20]: obj4 = Series(sdata, index=states) In [21]: obj4 Out[21]: California NaN Ohio 35000.0 Oregon 16000.0 Texas 71000.0 dtype: float64
在这种情况下, sdata 中的3个值被放在了合适的位置,但因为没有发现对应于 ‘California’ 的值,就出现了 NaN (不是一个数),这在pandas中被用来标记数据缺失或 NA 值。在pandas中用函数 isnull 和 notnull 来检测数据丢失:
In [22]: pd.isnull(obj4) Out[22]: California True Ohio False Oregon False Texas False dtype: bool In [23]: pd.notnull(obj4) Out[23]: California False Ohio True Oregon True Texas True dtype: boolSeries的索引可以通过赋值就地更改:
In [24]: obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan'] In [25]: obj Out[25]: Bob 4 Steve 7 Jeff -5 Ryan 3 dtype: int64
二、DataFrame
一个Datarame表示一个表格,类似电子表格的数据结构,包含一个经过排序的列表集,它们每一个都可以有不同的类型值(数字,字符串,布尔等等)。Datarame有行和列的索引;它可以被看作是一个Series的字典(每个Series共享一个索引)。与其它你以前使用过的(如 R 的 data.frame )类似Datarame的结构相比,在DataFrame里的面向行和面向列的操作大致是对称的。在底层,数据是作为一个或多个二维数组存储的,而不是列表,字典,或其它一维的数组集合。
因为DataFrame在内部把数据存储为一个二维数组的格式,因此你可以采用分层索引以表格格式来表示高维的数据。
有很多方法来构建一个DataFrame,但最常用的一个是用一个相等长度列表的字典或NumPy数组:
In [1]: data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], ...: 'year': [2000, 2001, 2002, 2001, 2002], ...: 'pop': [1.5, 1.7, 3.6, 2.4, 2.9]} In [2]: DataFrame(data) Out[2]: pop state year 0 1.5 Ohio 2000 1 1.7 Ohio 2001 2 3.6 Ohio 2002 3 2.4 Nevada 2001 4 2.9 Nevada 2002
如果你设定了一个列的顺序,DataFrame的列将会精确的按照你所传递的顺序排列:
In [3]: DataFrame(data, columns=['year', 'state', 'pop']) Out[3]: 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
和Series一样,如果你传递了一个行,但不包括在 data 中,在结果中它会表示为NA值:
In [4]: frame2 = DataFrame(data, columns=['year', 'state', 'pop', 'debt'], ...: index=['one', 'two', 'three', 'four', 'five']) In [5]: frame2 Out[5]: 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 In [6]: frame2.columns Out[6]: Index(['year', 'state', 'pop', 'debt'], dtype='object')
和Series一样,在DataFrame中的一列可以通过字典记法或属性来检索:
In [7]: frame2['state'] Out[7]: one Ohio two Ohio three Ohio four Nevada five Nevada Name: state, dtype: object In [8]: frame2.year Out[8]: one 2000 two 2001 three 2002 four 2001 five 2002 Name: year, dtype: int64
列可以通过赋值来修改。例如,空的 ‘debt’ 列可以通过一个纯量或一个数组来赋值:
In [9]: frame2['debt'] = 16.5 In [10]: frame2 Out[10]: 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 In [11]: frame2['debt'] = np.arange(5.) In [12]: frame2 Out[12]: 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
通过列表或数组给一列赋值时,所赋的值的长度必须和DataFrame的长度相匹配。如果你使用Series来赋值,它会代替在DataFrame中精确匹配的索引的值,Series没有的数据在DataFrame中就会被更新为NaN:
In [13]: val = Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five']) In [14]: frame2['debt'] = val In [15: frame2 Out[15]: year state pop debt one 2000 Ohio 1.5 NaN two 2001 Ohio 1.7 -1.2 three 2002 Ohio 3.6 NaN four 2001 Nevada 2.4 -1.5 five 2002 Nevada 2.9 -1.7
给一个不存在的列赋值,将会创建一个新的列。 像字典一样 del 关键字将会删除列:
In [16]: frame2['eastern'] = frame2.state = 'Ohio' In [17]: frame2 Out[17]: year state pop debt eastern one 2000 Ohio 1.5 NaN Ohio two 2001 Ohio 1.7 -1.2 Ohio three 2002 Ohio 3.6 NaN Ohio four 2001 Ohio 2.4 -1.5 Ohio five 2002 Ohio 2.9 -1.7 Ohio In [18]: del frame2['eastern'] In [19]: frame2.columns Out[19]: Index(['year', 'state', 'pop', 'debt'], dtype='object')