声明:本系列笔记由本人翻译自https://stat430.hknguyen.org/(有部分删改以便更好学习)
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