2、pandas入门

  ​​pandas​​​所包含的数据结构和数据处理工具的设计使得在Python中进行数据清洗和分析非常快捷。​​pandas​​​支持大部分​​NumPy​​​语言风格的数组计算,尤其是数组函数以及没有​​for​​循环的各种数据处理。

2.1 pandas数据结构介绍

  ​​pandas​​​中需要熟悉两个常用的工具数据结构:​​Series​​​和​​DataFrame​​。

2.1.1 Series

  ​​Series​​​是一种一维的数组型对象,它包含了一个值序列(与​​NumPy​​​中的类型相似),并且包含了数据标签,称为索引(​​index​​)。

In [1]: import pandas as pd

In [2]: obj = pd.Series([3,4,-1,3])

In [3]: obj
Out[3]:
0 3
1 4
2 -1
3 3
dtype: int64

In [4]: obj.values
Out[4]: array([ 3, 4, -1, 3], dtype=int64)

In [5]: obj.index
Out[5]: RangeIndex(start=0, stop=4, step=1)

  可以自己创建索引序列:

In [6]: obj2 = pd.Series([3,6,-2,8],index=['v','s','q','sd'])

In [7]: obj2
Out[7]:
v 3
s 6
q -2
sd 8
dtype: int64

In [8]: obj2.index
Out[8]: Index(['v', 's', 'q', 'sd'], dtype='object')

  可以使用和​​numpy​​相同的操作:

In [9]: obj2[obj2 > 0]
Out[9]:
v 3
s 6
sd 8
dtype: int64

In [10]: obj2 * 2
Out[10]:
v 6
s 12
q -4
sd 16
dtype: int64

In [11]: 'b' in obj2
Out[11]: False

In [12]: 's' in obj2
Out[12]: True

  从另一个角度考虑​​Series​​​,可以认为它是一个长度固定且有序的字典,因为它将索引值和数据值按位置配对。如果已经有数据包含在Python字典中,你可以使用字典生成一个​​Series​​:

In [13]: sdata = {'Ohio' : 2344, 'Relx' : 2467, 'Bob' : 9023}

In [14]: sdata
Out[14]: {'Bob': 9023, 'Ohio': 2344, 'Relx': 2467}

In [15]: obj3 = pd.Series(sdata)

In [16]: obj3
Out[16]:
Bob 9023
Ohio 2344
Relx 2467
dtype: int64

  把字典传递给​​Series​​​构造函数时,产生的​​Series​​的索引将是排序好的字典键。

  ​​pandas​​​中使用​​isnull​​​和​​notnull​​函数来检查缺失数据:

In [17]: states = ['Caly', 'Ohio', 'Relx', 'Bob']

In [18]: obj4 = pd.Series(sdata, index=states)

In [19]: obj4
Out[19]:
Caly NaN
Ohio 2344.0
Relx 2467.0
Bob 9023.0
dtype: float64

In [20]: pd.isnull(obj4) # 用来检验数据是否有缺失
Out[20]:
Caly True # 有缺失
Ohio False
Relx False
Bob False
dtype: bool

In [21]: pd.notnull(obj4) # 用来检验数据是否没有缺失
Out[21]:
Caly False
Ohio True # True说明 没有缺失
Relx True
Bob True
dtype: bool

  ​​Series​​​对象自身和其索引都有​​name​​​属性,这个特性与​​pandas​​其他重要功能集成在一起:

In [22]: obj4.name

In [23]: obj4.name = 'popluation'

In [24]: obj4.index.name = 'state'

In [25]: obj4
Out[25]:
state
Caly NaN
Ohio 2344.0
Relx 2467.0
Bob 9023.0
Name: popluation, dtype: float64

  ​​Series​​的索引可以通过按位置赋值的方式进行改变:

In [26]: obj
Out[26]:
0 3
1 4
2 -1
3 3
dtype: int64

In [27]: obj.index = ['Bob', 'Steve', 'Lily', 'Cindy']

In [28]: obj
Out[28]:
Bob 3
Steve 4
Lily -1
Cindy 3
dtype: int64

2.1.2 DataFrame

  ​​DataFrame​​​表示的是矩阵的数据表,它包含已排序的列集合,每一列可以是不同的值类型(数值、字符串、布尔值等)。​​DataFrame​​​既有行索引也有列索引,它可以被视为一个共享相同索引的​​Series​​​的字典。在​​DataFrame​​中,数据被存储为一个以上的二维块,而不是列表、字典或其他一维数组的集合。

  有多种方式可以构建​​DataFrame​​​,其中最常用的方式是利用包含等长度列表或​​NumPy​​​数组的字典来形成​​DataFrame​​:

In [31]: data = {'state' : ['Ohio', 'Nevada', 'Amenda', 'Lily'],'year' : [2000, 1999, 20
...: 02, 1995], 'pop' : [1.3, 1.2, 1.7, 1.9]}

In [32]: frame = pd.DataFrame(data)

In [33]: frame
Out[33]:
pop state year
0 1.3 Ohio 2000
1 1.2 Nevada 1999
2 1.7 Amenda 2002
3 1.9 Lily 1995

In [34]: frame = pd.DataFrame(data, columns = ['year', 'pop', 'state']) # 按照要求分配索引

In [35]: frame
Out[35]:
year pop state
0 2000 1.3 Ohio
1 1999 1.2 Nevada
2 2002 1.7 Amenda
3 1995 1.9 Lily

  对于大型​​DataFrame​​​, ​​head​​方法将会只选出头部的五行:

In [36]: frame.head()
Out[36]:
year pop state
0 2000 1.3 Ohio
1 1999 1.2 Nevada
2 2002 1.7 Amenda
3 1995 1.9 Lily

  ​​DataFrame​​​中的一列,可以按字典型标记或属性那样检索为​​Series​​:

In [37]: frame['year']
Out[37]:
0 2000
1 1999
2 2002
3 1995
Name: year, dtype: int64

In [38]: frame.state
Out[38]:
0 Ohio
1 Nevada
2 Amenda
3 Lily
Name: state, dtype: object

  转置:

data = {
'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002],
'pop':[1.5,1.7,3.6,2.4,2.9]
}
frame = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])
print(frame)
print(frame.T)
'''
pop state year
a 1.5 Ohio 2000
b 1.7 Ohio 2001
c 3.6 Ohio 2002
d 2.4 Nevada 2001
e 2.9 Nevada 2002
a b c d e
pop 1.5 1.7 3.6 2.4 2.9
state Ohio Ohio Ohio Nevada Nevada
year 2000 2001 2002 2001 2002
'''

  和​​Series​​​类似,​​DataFrame​​​的​​values​​​属性会将包含在​​DataFrame​​​中的数据以二维​​ndarray​​的形式返回:

In [39]: frame
Out[39]:
year pop state
0 2000 1.3 Ohio
1 1999 1.2 Nevada
2 2002 1.7 Amenda
3 1995 1.9 Lily

In [40]: frame.values
Out[40]:
array([[2000, 1.3, 'Ohio'],
[1999, 1.2, 'Nevada'],
[2002, 1.7, 'Amenda'],
[1995, 1.9, 'Lily']], dtype=object)

2.1.3 索引对象

  ​​pandas​​中的索引对象是用于存储轴标签和其他元数据的(例如轴名称或标签)。索引对象是不可变的,因此用户是无法修改索引对象的:

In [41]: obj = pd.Series(range(3), index = ['a', 'b', 'c'])

In [42]: index = obj.index

In [43]: index
Out[43]: Index(['a', 'b', 'c'], dtype='object')

In [44]: index[1:]
Out[44]: Index(['b', 'c'], dtype='object')

In [45]: index[1]
Out[45]: 'b'

  与Python集合不同,​​pandas​​索引对象可以包含重复标签:

In [47]: labels = pd.Index(['a', 'a', 'a', 'v', 'c'])

In [48]: labels
Out[48]: Index(['a', 'a', 'a', 'v', 'c'], dtype='object')

  一些索引对象的方法和属性

利用Python进行数据分析——pandas入门(4)_数据