Series的定义与创建
Series类型由一组数据及与之相关的数据索引组成,Pandas特别强调数据和索引之间的关系,Series类型索引与数据之间一一对应。
a = pd.Series([9,8,7,6])
a
0 9
1 8
2 7
3 6
dtype: int64
输出结果中,左边一列为输出索引,右边一列为值,由于Pandas是基于Numpy实现的扩展的数据分析库,其中所有数据的类型沿用了Numpy种类型,dtype:init64表示64位的整数类型。
除了自动索引之外,Series提供了更为强大的自定义索引功能。
b = pd.Series([9,8,7,6],index=['a','b','c','d'])
b
a 9
b 8
c 7
d 6
dtype: int64
可以发现,索引变成了自定义的索引列表,在此可以省略index=,直接给出索引。
Series可以由如下类型创建:
s = pd.Series(25,index=['a','b','c'])
s
a 25
b 25
c 25
dtype: int64
此时为了创建一个Series类型,必须要增加index,用以告诉Series几个元素构成,标签是多少。
c = pd.Series({'a':9,'b':8,'c':7,'d':6})
c
a 9
b 8
c 7
d 6
dtype: int64
使用字典生成Series类型,keys对应index,value对应值。除此之外,字典类型还有另外的操作方法:
d = pd.Series({'a':9,'b':8,'c':7,'d':6},index=['c','a','b','d','e'])
d
c 7.0
a 9.0
b 8.0
d 6.0
e NaN
dtype: float64
由index指定Series结构(顺序),并从前面的字典类型种选取对应值。
e = pd.Series(np.arange(6))
e
0 0
1 1
2 2
3 3
4 4
5 5
dtype: int32
f = pd.Series(np.arange(6),index=(np.arange(9,3,-1)))
f
9 0
8 1
7 2
6 3
5 4
4 5
dtype: int32
Series的基本操作
- 由于Series包含索引和值两个部分,所以基本操作可以分为索引部分和值部分;
b = pd.Series([9,8,7,6],index=['a','b','c','d'])
b
a 9
b 8
c 7
d 6
dtype: int64
b.index
Index(['a', 'b', 'c', 'd'], dtype='object')
b.values
b.values
array([9, 8, 7, 6], dtype=int64)
可以发现b.index输出的索引,类型就叫index,实际上Pandas索引是存在一个类型的,就叫index类型,b.values输出的是array,属于Numpy的类型。
由此可以知道,Series类型将Numpy的类型作为保留值的类型,而自己关联了索引,索引是Pandas内部自己建立的名为index 的类型,index和Numpy的array结合起来就是一个Series类型。
b['b']
8
b[1]
8
可以看到,当index为自定义时,我们仍能够使用默认的从0开始的索引得到对应的值,那我们能混合使用吗?
b[['a','b',2]]
a 9.0
b 8.0
2 NaN
dtype: float64
可以发现,两套索引并存,但是不能混用。
- Series类型的操作类似ndarray类型;
索引方法相同,使用[];
Numpy中针对ndarray的操作也可以用于Series类型;
可以使用自定义索引的列表进行切片;
也可以使用自定义索引进行切片,如果存在自定义索引,则一同被切片;
b = pd.Series([9,8,7,6],index=['a','b','c','d'])
b
a 9
b 8
c 7
d 6
dtype: int64
b[3]
6
b[:3]
a 9
b 8
c 7
dtype: int64
可以发现,如果我们索引一个元素,那么我们得到的是索对应的值,当我们使用自定义索引对Series进行切片时,得到的结果仍然是Series类型,有索引和值两个部分,我们也可以使用 比较关系进行索引。
b [b > b.median()]
b [b > b.median()]
a 9
b 8
dtype: int64
取b中大于b中位数的Series部分。
np.exp(b)
a 8103.083928
b 2980.957987
c 1096.633158
d 403.428793
dtype: float64
- Series类型的操作类似Python字典类型;
通过自定义索引访问;
保留字in操作;
使用get()方法;
b = pd.Series([9,8,7,6],index=['a','b','c','d'])
b
a 9
b 8
c 7
dtype: int64
b['b']
8
由此可以看出通过访问值对应的索引获取值。
'c'in b
True
0 in b
False
Python的字典类型中有一个保留字in,用以判断字典类型的键在不在键值对中的键的范围中,这里可以用in判断一个数据是不是在Series索引的列表中,‘c’是b索引的一部分,所以为True,0 in b为False,因为0不在b 的索引中,不会判断自动索引。
b.get('f',100)
100
使用字典中的get()函数,从b中提取标签(索引)f对应的值,若这个值不存在,就把100返回,若存在,就返回f对应的值。
Series的对齐操作
Series + Series
a = pd.Series([1,2,3],['c','d','e'])
b = pd.Series([9,8,7,6],index=['a','b','c','d'])
a + b
a NaN
b NaN
c 8.0
d 8.0
e NaN
dtype: float64
在Series对象进行操作的时候,更应该考虑他们的索引,上述a+b的结果是索引相同的值进行运算,不同的值不进行运算,得到了五个元素的对象,a中没有b的索引时,相加得到的值为空(NaN),这个概念叫做对其,也就是Series类型在运算中会自动对齐不同索引的数据,相比Numpy的中的运算 ,由于Numpy只关心数据的维度,当不同维度相加时,就会报错,无法得到结果,而Series的运算是基于索引的运算,这是更加精确的。
Series的name属性
Series对象和索引都可以有一个名字,存储在属性.name中。
b = pd.Series([9,8,7,6],index=['a','b','c','d'])
b.name
b.name = 'Series对象'
b.index.name = '索引列'
b
索引列
a 9
b 8
c 7
d 6
Name: Series对象, dtype: int64
可以看到,没有对name进行定义前,b.name无输出,b.name进行指定后得到Series的名字或者对应值的名字,b.index.name进行指定后得到索引列的名字。
同时Series对象可以随时修改并立刻生效。
b = pd.Series([9,8,7,6],index=['a','b','c','d'])
b.name
b['a'] = 15
b.name = "Series"
b
a 15
b 8
c 7
d 6
Name: Series, dtype: int64
b.name = "New Series"
b[1:3] = 20
b
a 15
b 20
c 20
d 6
Name: New Series, dtype: int64