Series数据结构
简介
- Series又称之为序列
- Series是一种类似于一维数组的对象,由下面两个部分组成:
- values:一组数据(ndarray类型)
- index:相关的数据索引标签
- name: 为该序列起一个名字,主要在形成DataFrame时,方便行/列的操作
- 由于序列包含了ndarray的结构,所以他可以支持元素级的操作和广播特性
import pandas as pd
import numpy as np
s1 = pd.Series(data=[62, 75, 88, 83])
s1
---------------------------------------------------------------------------
结果:
0 62
1 75
2 88
3 83
dtype: int64
- 默认一个Series左边的称之为索引Index,右边的称之为值values
- 若没有指定索引,默认按照自然数0开始递增
- 可以通过series下的index和values属性访问索引和值
s1.index
---------------------------------------------------------------------------
结果:RangeIndex(start=0, stop=4, step=1)
s1.values
---------------------------------------------------------------------------
结果:array([62, 75, 88, 83], dtype=int64)
s1.name = '数学'
s1
---------------------------------------------------------------------------
结果:
0 62
1 75
2 88
3 83
Name: 数学, dtype: int64
Series创建
创建的空间特性
- 可以使用两种创建方式
- 1).列表或ndarray
- 列表会进行拷贝
- ndarr
- 2).字典结构
- 字典的key就是Series的index
- 字典的value就是Series的values
- 1).列表或ndarray
data_list = [2, 4, 5, 8]
data_array = np.array(data_list)
s2 = pd.Series(data=data_list, index=list("ABCD"))
s3 = pd.Series(data=data_array, index=list("ABCD"))
s2[0] = 100
s3[0] = 100
display(data_list, data_array, s2, s3)
---------------------------------------------------------------------------
结果:
[2, 4, 5, 8]
array([100, 4, 5, 8])
A 100
B 4
C 5
D 8
dtype: int64
A 100
B 4
C 5
D 8
dtype: int32
data_dict = {"A": 10, "B": 20, "C": 30, "D": 40}
s4 = pd.Series(data=data_dict)
s4
---------------------------------------------------------------------------
结果:
A 10
B 20
C 30
D 40
dtype: int64
Series的索引和切片
- 序列具备一维ndarray的特性,所以索引和切片的方式同理一样的语法
- 序列的索引和切片的语法形式:
- 数字行为,和ndarray行为一致
- 前闭后开
- index值行为,Series还有index的属性,方便操作
- 前闭后闭
- 数字行为,和ndarray行为一致
display(s4[0], s4[3])
---------------------------------------------------------------------------
结果:
10
40
display(s4[:3])
---------------------------------------------------------------------------
结果:
A 10
B 20
C 30
dtype: int64
display(s4["A"], s4["D"])
---------------------------------------------------------------------------
结果:
10
40
s4[:"C"]
---------------------------------------------------------------------------
结果:
A 10
B 20
C 30
dtype: int64
序列同时增加了loc和iloc的属性,方便切片
- loc[] : 跟index的值操作,又称之为显示索引
- iloc[]: 跟数字的操作一致,又称之为隐式索引
s4.loc["B":"C"]
---------------------------------------------------------------------------
结果:
B 20
C 30
dtype: int64
s4.iloc[1:3]
---------------------------------------------------------------------------
结果:
B 20
C 30
dtype: int64
序列的操作
- 可以把Series看成一个定长的有序字典
- 查看序列
- series.head(n) : 看前n行的数据
- series.tail(n) : 看后n行的数据
- 当索引没有对应的值时,出现缺失数据显示NaN的情况
- 当2个序列相加时,是按照索引值对应相加,若没有对应的索引,结果以NaN出现
s5 = pd.Series(data=[1, 2, 3, 4], index=list("ABCD"))
s6 = pd.Series(data=[2, 3, 4, 5], index=list("ABEF"))
s7 = s5+s6
s7
---------------------------------------------------------------------------
结果:
A 3.0
B 5.0
C NaN
D NaN
E NaN
F NaN
dtype: float64
- 序列如何查看哪些位置是NaN值
- 可以使用pd.isnull(),pd.notnull(),或自带isnull(),notnull()函数检测缺失数据
- 函数说明:
- pd.isna()/pd.isnull() : 探测序列中每个元素是否为NaN,返回布尔序列。
- pd.notna()/pd.notnull() : 探测序列中每个元素是否不为NaN,返回布尔序列。
- 利用上一步产生的布尔索引,在series中重新投影即可
pd.isna(s7)
---------------------------------------------------------------------------
结果:
A False
B False
C True
D True
E True
F True
dtype: bool
序列的计算
- 适用于numpy的数组运算也适用于Series
- Series之间的运算
- 在运算中自动对齐不同索引的数据
- 如果索引不对应,则补NaN
- 注意:要想保留所有的index,则需要使用.add()函数
- 利用add函数里,有一个fill_value的参数,对缺失值位置补上对应的值
s8 = s5.add(s6, fill_value=0)
s8
---------------------------------------------------------------------------
结果:
A 3.0
B 5.0
C 3.0
D 4.0
E 4.0
F 5.0
dtype: float64