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')
一些索引对象的方法和属性