Pandas:Series

  • 什么是Series
  • Series中的索引 切片 筛选操作
  • Series的算术运算

我们要开始学习pandas,就首先需要熟悉pandas中的基础数据结构,本篇中介绍了Series。

1.什么是Series

一个Series是一个类似于一维数组的对象。它包含了一系列数据值(Numpy数组类型)以及一系列可用于索引这些数据值的标签。

利用pandas中的Series()方法可以从一个list对象创建一个Series对象。

import pandas as pd

obj = pd.Series([4, 7, -5, 3])
print(obj)

#输出
0    4
1    7
2   -5
3    3
dtype: int64

在这个例子中,因为我们没有为数据分配特定的下标,所以默认下标就是0~N-1的整数

通过Series的values与index属性,我们可以获取其数据值以及下标值

obj.values
#输出
array([ 4,  7, -5,  3])

obj.index
#输出
RangeIndex(start=0, stop=4, step=1)

当然在创建Series时我们也可以分配特定的下标:

obj2 = pd.Series([4, 7, -5, 3], index=['a', 'b', 'c', 'd'])
print(obj2)

#输出
a    4
b    7
c   -5
d    3
dtype: int64

2.Series中的索引 切片 筛选操作

2.1 索引

我们用方括号[]加下标的方式来选取元素,或是选取这个series的一个子序列。

obj

#输出
0    4
1    7
2   -5
3    3
dtype: int64

obj[0]

#输出
4

obj[[0, 3]]

#输出
0    4
3    3
dtype: int64

在我们设定了特定下标标签的情况下,只要用标签来索引元素即可。

当然如果使用数字下标,python也会明白你的指令

obj2

#输出
a    4
b    7
c   -5
d    3
dtype: int64

obj2['b']

#输出
7

obj2[1]

#输出
7

2.2 切片

和python里的list一样,series同样支持用数字切片

obj[0:2]

#输出
0    4
1    7
dtype: int64

也可以用标签来进行切片,但是要注意的是此时不像传统的切片区间为左闭右开,而是包括了右边的截止点。

obj2['b':'c']

#输出
b    7
c   -5
dtype: int64

2.3 筛选

我们可以和Numpy数组一样,利用布尔表达式来筛选Series。

obj

#输出
0    4
1    7
2   -5
3    3
dtype: int64

obj[obj < 2]

#输出
2   -5
dtype: int64

obj[obj % 2 == 0]

#输出
0    4
dtype: int64

这是一种对于内置数据结构list的升级,如果对于list使用布尔表达式作筛选将会报错。

3.Series的算术运算

3.1 对于拥有相同下标的series对象的算术运算

通过例子可以发现本质是将对应的数据元素进行相关运算操作。

s1 = pd.Series([7.3, -2.5, 3.4, 1.5])

s1
0    7.3
1   -2.5
2    3.4
3    1.5
dtype: float64


s1 + s1
0    14.6
1    -5.0
2     6.8
3     3.0
dtype: float64


s1 * 5
0    36.5
1   -12.5
2    17.0
3     7.5
dtype: float64

s1 / 2
0    3.65
1   -1.25
2    1.70
3    0.75
dtype: float64

3.2 对于拥有不同下标的series对象的算术运算

通过例子可以发现,如果一个下标仅存在于一个series对象中,那么运算结果里该标签对应的值将是NaN(Not a Number)类型

s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=['a', 'c', 'd', 'e'])
s2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1], index=['a', 'c', 'e', 'f', 'g'])

s1
a    7.3
c   -2.5
d    3.4
e    1.5
dtype: float64

s2
a   -2.1
c    3.6
e   -1.5
f    4.0
g    3.1
dtype: float64

s1 + s2
a    5.2
c    1.1
d    NaN
e    0.0
f    NaN
g    NaN
dtype: float64

如果我们不想要NaN类型,想保留该标签在原series对象中对应的值,可以借助add()方法里的fill_value参数

s1.add(s2, fill_value=0)

a    5.2
c    1.1
d    3.4
e    0.0
f    4.0
g    3.1
dtype: float64