继上一节的 pandas
基本数据结构的介绍之后,本节继续介绍 pandas
中操作 Series
和 DataFrame
的基本手段。一个最常用的操作就是索引,如何根据分析目的对 Series
和 DataFrame
进行索引访问得到数据是利用 pandas
进行数据分析的基本技能之一。索引用的好,对于数据访问、筛选和过滤以及理解 pandas
数据结构至关重要。
obj = Series(arange(5), index = ['a','b','c','d','e'])
#按标签索引
obj['c']
2
#索引多个值
obj[2:4]
c 2
d 3
dtype: int32
#按标签索引多个值
obj[['b','c','d']]
b 1
c 2
d 3
dtype: int32
#与切片不同的是,索引的末尾是包括在内的
obj['b':'c']
b 1
c 2
dtype: int32
可见 Series
的索引方式非常简单,既可以按其索引标签来进行索引,也可以按数字排序来进行索引。需要注意的是, pandas
中索引与切片有一点细微的区别就是索引的末端是包括在内的。 再来看 DataFrame
的索引和访问方式:
#创建一个DataFrame
data = {'city':['LAL','HOU','PHI','TOR'],
'year':[1996,1997,1996,1997],
'score':[30.3,30.1,29.4,25.6]}
frame = DataFrame(data, index = ['Lakers','Rockets','Sixers','Raptors'])
frame
city score year
Lakers LAL 30.3 1996
Rockets HOU 30.1 1997
Sixers PHI 29.4 1996
Raptors TOR 25.6 1997
DataFrame
具有行列属性,所以在索引上除了习惯性的按列索引之外,按行索引也是不错的数据访问方式:
#按列索引
frame['city']
Lakers LAL
Rockets HOU
Sixers PHI
Raptors TOR
Name: city, dtype: object
#索引多个列
frame[['city','score']]
city score
Lakers LAL 30.3
Rockets HOU 30.1
Sixers PHI 29.4
Raptors TOR 25.6
按列名进行多个列的索引时,传入的是一个 list
形态。再看 DataFrame
按行索引的方式:
#取前两行
frame[:2]
city score year
Lakers LAL 30.3 1996
Rockets HOU 30.1 1997
#按条件索引
frame[frame['score']>30]
city score year
Lakers LAL 30.3 1996
Rockets HOU 30.1 1997
#loc方法直接进行行索引
frame.loc[['Sixers','Raptors']]
city score year
Sixers PHI 29.4 1996
Raptors TOR 25.6 1997
所以在 pandas
中按行索引也较为方便,特别注意一下 loc
方法即可, loc
方法的以前版本为 ix
,本身即为索引访问之意。除此之外,针对 Series
和 DataFrame
索引的方法还包括 reindex
、 xs
以及 get_value
等方法,具体大家可以试一试效果。
说完了基础索引,再来看 pandas
层次化索引。作为 pandas
的一项重要功能,顾名思义就是能够对数据对象进行多层索引,具体看实例:
#创建一个具有多层索引的Series
data2 = Series(random.randn(10),
index = [['a','a','a','b','b','b','c','c','d','d'],
[1,2,3,1,2,3,1,2,2,3]])
data2
a 1 -0.234979
2 1.344633
3 -0.288830
b 1 -0.351565
2 1.321889
3 -0.452482
c 1 0.923785
2 0.315827
d 2 0.439779
3 -1.491468
dtype: float64
#查看该Series的层级索引对象
data2.index
MultiIndex(levels=[['a', 'b', 'c', 'd'], [1, 2, 3]],
labels=[[0, 0, 0, 1, 1, 1, 2, 2, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 1, 2]])
#第一层索引
data2['b']
1 -0.351565
2 1.321889
3 -0.452482
dtype: float64
#第一层索引多个对象
data2['b':'c']
b 1 -0.351565
2 1.321889
3 -0.452482
c 1 0.923785
2 0.315827
dtype: float64
loc
方法也可以实现同样的索引访问效果:
data2.loc[['b','d']]
b 1 -0.351565
2 1.321889
3 -0.452482
d 2 0.439779
3 -1.491468
dtype: float64
#也可以在内层直接索引
#即访问第二层数据下所有的第二索引
data2[:,2]
a 1.344633
b 1.321889
c 0.315827
d 0.439779
dtype: float64
如果觉得多层索引的 Series
不太好看,也可以直接通过 unstack
方法将其转化为 DataFrame
:
#将包含多层索引的Series转化为一个DataFrame
data2.unstack()
1 2 3
a -0.234979 1.344633 -0.288830
b -0.351565 1.321889 -0.452482
c 0.923785 0.315827 NaN
d NaN 0.439779 -1.491468
unstack
和 stack
互为逆运算,转换过来的 DataFrame
也可以通过 stack
方法换回去。
#返回去也是容易的
data2.unstack().stack()
a 1 -0.234979
2 1.344633
3 -0.288830
b 1 -0.351565
2 1.321889
3 -0.452482
c 1 0.923785
2 0.315827
d 2 0.439779
3 -1.491468
dtype: float64
以上是 Series
的层次化索引方式,再来看看 DataFrame
的层次化索引:
#创建一个具有分层索引的DataFrame
frame2 = DataFrame(arange(12).reshape((4,3)),
index=[['a','a','b','b'],[1,2,1,2]],
columns=[['Ohio','Ohio','Colorado'],
['Green','Red','Green']])
frame2
Ohio Colorado
Green Red Green
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
#可以为各层指定名称
frame2.index.names = ['key1','key2']
frame2.columns.names = ['state','color']
frame2
state Ohio Colorado
color Green Red Green
key1 key2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
#根据分部的列标签进行索引
frame2['Colorado']
color Green
key1 key2
a 1 2
2 5
b 1 8
2 11
#将DataFrame的列作为行来索引
frame3 = DataFrame({'a':range(7),'b':range(7,0,-1),
'c':['one','one','one','two','two','three','three'],
'd':[0,1,2,0,1,2,3]})
frame3
a b c d
0 0 7 one 0
1 1 6 one 1
2 2 5 one 2
3 3 4 two 0
4 4 3 two 1
5 5 2 three 2
6 6 1 three 3
好了,本次推送就给大家介绍到这里啦。关于的数据索引和访问方法,除了对基本的语法有所熟识之外,更需要在实际的数据处理实践中练习掌握。
参考资料:
python for data analysis
往期精彩:
一个数据科学热爱者的学习历程