为了入门pandas,首先要了解两个常见的数据结构:Series和DataFrame。本篇文章首先介绍Series,包括Series的基本结构、基本属性等,着重介绍Series的索引。
Series的基本结构
Series是一维的数组型对象,它包含了一个值序列,一个索引序列,还有一个标识数据类型的dtype属性。在Python交互环境中,索引序列在左边,值序列在右边。
In [2]: obj = pd.Series([2, 4, 6, 8])
In [3]: obj
Out[3]:
0 2
1 4
2 6
3 8
dtype: int64
上图在创建Series对象时,没有指定索引,自动生成了从0到N-1的索引序列,其中N是数据的长度。如果想要自己指定索引,可以通过index
关键词传递。
In [4]: obj = pd.Series([1, 3, 5, -7], index=['a', 'b', 'c', 'd'])
In [5]: obj
Out[5]:
a 1
b 3
c 5
d -7
dtype: int64
从另一个角度考虑Series,可以将其看成一个长度固定且有序的字典。可以直接向pd.Series()
传递一个字典对象,生成Series对象。
In [6]: sdata = {'Ohio': 35000, 'Texas':71000, 'Oregon': 16000, 'Utea': 5000}
In [7]: obj1 = pd.Series(sdata)
In [8]: obj1
Out[8]:
Ohio 35000
Texas 71000
Oregon 16000
Utea 5000
dtype: int64
字典的key自动变成Series的索引序列,如果想要选取字典中的部分数据或者更改键值对的顺序,可以通过index
关键词传递。
In [9]: obj2 = pd.Series(sdata, index=['California', 'Ohio', 'Oregon', 'Utea'])
In [10]: obj2 # sdata中没有California,因此生成的obj2的值为NaN。
Out[10]:
California NaN
Ohio 35000.0
Oregon 16000.0
Utea 5000.0
dtype: float64
Series的基本属性
-
obj.values
属性 -
obj.index
属性
In [11]: obj
Out[11]:
a 1
b 3
c 5
d -7
dtype: int64
In [12]: obj.values # 通过obj.values属性获取Series的值
Out[12]: array([ 1, 3, 5, -7], dtype=int64)
In [13]: obj.index # 通过obj.index属性获取Series的索引
Out[13]: Index(['a', 'b', 'c', 'd'], dtype='object')
obj.name
属性obj.index.name
属性
In [17]: obj.name = 'number'
In [18]: obj.index.name = 'label'
In [19]: obj
Out[19]:
label
a 1
b 3
c 5
d -7
Name: number, dtype: int64
Series的索引
- 通过索引选取数据或赋值
In [20]: obj['a']
Out[20]: 1
In [21]: obj['a'] = 100
In [22]: obj
Out[22]:
label
a 100
b 3
c 5
d -7
Name: number, dtype: int64
- 通过布尔索引过滤数据
In [23]: obj[obj>0]
Out[23]:
label
a 100
b 3
c 5
Name: number, dtype: int64
- 特殊的神奇索引
神奇索引是指由整数序列所构成的索引,序列中的整数表示选取顺序,从而实现按照指定的顺序选取数据。如下所示:
In [26]: arr = np.empty((8, 4))
In [27]: for i in range(8):
...: arr[i] = i
...:
In [28]: arr
Out[28]:
array([[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[4., 4., 4., 4.],
[5., 5., 5., 5.],
[6., 6., 6., 6.],
[7., 7., 7., 7.]])
In [29]: arr[[5, 3, 7 , 1]]
Out[29]:
array([[5., 5., 5., 5.],
[3., 3., 3., 3.],
[7., 7., 7., 7.],
[1., 1., 1., 1.]])
在Series中也有类似的功能,只不过这里的索引序列即可以是整数序列,也可以是字符串序列。
In [30]: obj
Out[30]:
label
a 100
b 3
c 5
d -7
Name: number, dtype: int64
In [31]: obj[['b', 'c', 'a']]
Out[31]:
label
b 3
c 5
a 100
Name: number, dtype: int64