Pandas的Series基础知识总结

目录

1、使用前导入相关模块

2、创建Series

3、Series相关属性及前/后N个数据获取

4、Series索引

5、Series切片

6、Series的CRUD

7、Series相关运算


1、使用前导入相关模块

import numpy as np
import pandas as pd
# 忽略警告信息
import warnings
warnings.filterwarnings("ignore")

注意:输出打印ipython和jupyter用display() / print();原生python和pycharm 用print()

2、创建Series

Series类型类似于Numpy的一维数组对象,可以将该类型看做是一组数据与数据相关的标签(索引)联合而构成(带有标签的一维数组对象)。 
Series数组对象由两部分构成:
值(value):一维数组的各元素值,是一个ndarray类型数据。  
索引(index):与一维数组值一一对应的标签。利用索引,我们可非常方便得在Series数组中进行取值。

创建方式

Series常用的创建(初始化)方式:

  • 列表等可迭代对象创建

# 创建Series:使用列表,如果创建Series不指定index,则生成默认的index(0 ~ n-1)
s1 = pd.Series([1, 2, 3, 4])
display(s)

s2 = pd.Series(range(1,10,2),index=list('abcde'),dtype=np.int32)
display(s2)

  • ndarray数组对象

s3= pd.Series((1,3,4,5))    #使用普通数组创建Series
print(s3)

s4 = pd.Series(np.array([1, 2, 3, 4]))     # 创建Series:使用ndarray数组
display(s4)

  • 字典对象

s5 = pd.Series({"a":"xr","b":"jalen","c":"ax"})    # 字典的key充当标签,字典的value充当Series的值。
display(s5)

  • 标量

s6 = pd.Series(33)     # 创建Series:标量
display(s6)

# 在创建Series时,可以使用index参数来显式指定索引。如果没有显式指定,则默认从0开始进行排列。
s7 = pd.Series(66, index=["k", "x", "y"])
display(s7)

s8 = pd.Series([66, 88, 99], index=["k", "x", "y"])
display(s8)

3、Series相关属性及前/后N个数据获取

s = pd.Series([1, 2, 3, 4], index=list("abcd"))    

  • index

display(s.index)           # 返回Series的索引对象。

  • values 、type(s.values)

display(s.values, type(s.values))      # 返回Series所关联的数组数据。naarray类型。

  • shape

display(s.shape)           # 返回Series对象的形状

  • size

display(s.size)     #返回元素个数

  • dtype

display(s.dtype)     #返回元素数据类型

  • ndim

display(s.ndim)      #返回数组的维度,Series:1

  • name

# s = pd.Series([1, 2, 3, 4])
# 在创建之后设置Series的name与Series的index的name。
s.name = "SeriesName"     # 设置 Series 的名字
s.index.name = "IndexName"   # 设置索引的名字
display(s)

# 在创建Series的同时,指定name。
s2 = pd.Series([1, 2, 3], name="Series name")
display(s2)

# 创建index对象。可以通过name参数来指定index的名称。
index = pd.Index(["a", "b", "c", "d"], name="IndexName")
s3 = pd.Series([1, 2, 3, 4], index=index, name="SeriesName")
display(s3)

Series对象本身及其索引index都有一个name属性,name属性主要发挥作用是在DataFrame中,当我们把一个Series对象放进DataFrame中,新的列将根据我们的name属性对该列进行命名,当我们没有给Series命名,DataFrame会自动帮我们命名为0

  • T

s = pd.Series([1,5,8,9])
s1= s.T                     #Series的转置等于自身
display(s)
display(s1)

Series对象可以通过index与values访问索引与值。其中,我们也可以通过修改index属性来修改Series的索引。

说明:

  • 如果没有指定索引,则会自动生成从0开始的整数值索引,也可以使用index显式指定索引。
  • Series对象与index具有name属性。Series的name属性可在创建时通过name参数指定。
  • Series对象的数据只能是一维数组类型。
  • 当数值较多时,可以通过head与tail访问前 / 后N个数据。

s = pd.Series([1,2,3,4,5,6,7])
display(s.head()) #默认前5行
display(s.tail()) #默认后5行
display(s.head(2))  #指定前2行
display(s.tail(6)) #指定后6行

4、Series索引

Series与ndarray数组都可以通过索引访问元素。

 不同点:

  • 1、ndarray就是类似与list的索引,支持负数,表示倒数。
  • 2、Series类似字典的key:value(index:value)形式的索引。不支持负数。

a = np.array([1, 2, 3])
display(a[-3])

s = pd.Series([1, 2, 3], index=["a", "b", "c"])
display(s)
display(s["c"])

标签索引与位置索引

如果Series对象的index值为非数值类型,通过[索引]访问元素,索引既可以是标签索引,也可以是位置索引。这会在一定程度上造成混淆。
我们可以通过:

  • loc 仅通过标签索引访问。
  • iloc 仅通过位置索引访问。

这样,就可以更加具有针对性去访问元素。

# Series的索引分为标签索引与位置索引。
s = pd.Series([1, 2, 3], index=list("abc"))
display(s)

# 既通过标签索引访问,也可以通过位置索引访问。
display(s["a"])
display(s[0])

# 如果指定的索引是数值类型,则位置索引就失灵。
s = pd.Series([1, 2, 3], index=[2, 3, 4])
display(s[3])
# 出错,因为位置索引不再可用。
# display(s[0])

loc(标签)和iloc(位置)

# 为了避免上诉的混淆性,我们可以通过loc与iloc进行更有针对的访问。
# loc 专门针对标签进行访问
# iloc专门针对位置进行访问
s = pd.Series([1, 2, 3], index=list("abc"))
display(s.loc["a"])
display(s.iloc[0])

整数数组索引与布尔数组索引

Series也支持使用整数数组与布尔数组进行索引。 说明:

  • 与ndarray数组的整数索引不太相同,Series的整数数组索引,既可以是标签数组索引,也可以是位置数组索引。
  • 与Numpy数组相同,二者返回的是原数组数据的拷贝(复制)

整数数组和标签数组

# 通过整数数组(标签数组索引或者位置数组索引)索引访问元素。
s = pd.Series([1, 2, 3, 4], index=list("abcd"))
display(s.loc["a"])
# 通过标签数组索引元素。
display(s.loc[["a", "d"]])
# 通过位置数组索引元素。
display(s.iloc[[0, 3]])

# 通过数组索引返回的是原数据的拷贝(彼此之间不受干扰)。【ndarray也是如此】
s = pd.Series([1, 2, 3, 4], index=list("abcd"))
s2 = s.iloc[[0, 3]]
s2[0] = 1000
display(s, s2)

布尔数组

s = pd.Series([1, 2, 3, 4], index=list("abcd"))
display(s[[True, False, True, False]])

# 实际过程中,布尔数组都是通过计算得出的。
b_array = s >= 3
display(b_array)
display(s[s >= 3])

5、Series切片

Series也支持切片访问一个区间的元素。与Numpy的数组相同,切片返回的是原数组数据的视图。

Series与ndarray数组都可以通过切片访问元素。

a = np.array([1, 2, 3,4,5])
display(a[2:3:-1])

s = pd.Series([1, 2,3,4,5,6], index=[0, 1, 2,3,4,5])
display(s)
display(s[2:4:-1])

# Series也支持切片操作。与ndarray相同的是,Series切片返回的也是原数据的视图。
s1 = pd.Series([1, 2, 3, 4])
s2 = s1[0:3]

# 要对s2改变,会影响到以前的s1。
s2[0] = 1000
display(s1, s2)

# Series的索引分为标签索引与位置索引,二者在切片的行为上是不一致的。
# 通过位置索引切片,不包含末尾的值,通过标签索引切片,包含末尾的值。

s = pd.Series([1, 2, 3, 4], index=list("abcd"))
# 通过位置索引切片
display(s.iloc[0:3])
# 通过标签索引切片
display(s.loc["a":"d"])

6、Series的CRUD

Series索引-数值CRUD操作:

  • 获取值
  • 修改值
  • 增加索引-值
  • 删除索引-值

s = pd.Series([1, 2, 3, 4, 5, 6 ,7], index=list("abcdefg"))
# 获取值,通过标签索引、位置索引(或者是二者的数组)、切片、前/后n个元素
display(s.loc["a"])
display(s.iloc[0])
display(s.iloc[[0,1,3]])
display(s.loc["c":"f"])
display(s.iloc[2:6])
display(s.head(2))
display(s.tail(2))
# 修改值
s.loc["a"] = 3000
display(s)

# 增加值 就可以像字典那样进行操作
s["new_key"] = "new_value"
s["h"] = 8
display(s)

s = pd.Series([1, 2, 3, 4, 5, 6 ,7], index=list("abcdefg"))
# 删除值 类似字典的操作,删除index,删除对应的值
del s["a"]
display(s)

# 删除值,通过drop方法。
# inplace,就地修改。如果指定为True,则不会返回修改修改后的结果(返回None)。
s.drop("b", inplace=True)
display(s)

# 可以提供一个标签列表,删除多个值。
s1 = s.drop(["c", "d"])
display(s1)

display(s)
s.drop(["c", "d"], inplace=True)
display(s)

e    5
f    6
g    7
dtype: int64
c    3
d    4
e    5
f    6
g    7
dtype: int64
e    5
f    6
g    7
dtype: int64

7、Series相关运算

Series在操作上,与Numpy数据具有如下的相似性:

  • 支持广播与矢量化运算。
  • 支持索引与切片。
  • 支持整数数组与布尔数组提取元素。

运算

Series类型也支持矢量化运算与广播操作。计算规则与Numpy数组的规则相同。同时,Numpy的一些函数,也适用于Series类型,例如,np.mean,np.sum等。
多个Series运算时,会根据索引进行对齐。当索引无法匹配时,结果值为NaN(缺失值)。

说明:

  • 我们可以通过pandas或Series的isnull与notnull来判断数据是否缺失。
  • 除了运算符以外,我们也可以使用Series对象提供的相关方法进行运算【可以指定缺失的填充值】。
  • 尽管Numpy的一些函数,也适用于Series类型,但Series与ndarray数组对于空值NaN的计算处理方式上是不同的。【Numpy的计算,会得到NaN,而Series会忽略NaN】

s1 = pd.Series([1, 2, 3])
s2 = pd.Series([4, 5, 6])
display(s1 * s2,s2 % s1) 
display(s1 * 2, s2 % 2)

# 对于numpy的一些函数,例如mean,sum等,也适用于Series。
display(np.mean(s1), np.sum(s1),np.max(s1),np.min(s1),np.size(s1))
display(s1.mean(),s1.sum(),s1.max(),s1.min(),s.size)

s1 = pd.Series([1, 2, 3], index=[1, 2, 3])
s2 = pd.Series([4, 5, 6], index=[2, 3, 4])

# Series与ndarray数组计算的不同。Series运行时,会根据标签进行对齐,如果标签无法匹配(对齐),就会产生空值(NaN)。
display(s1 + s2)

# 如果不想产生空值,则可以使用Series提供的计算方法来代替运算符的计算。
display(s1.add(s2, fill_value=100))  

1    NaN
2    6.0
3    8.0
4    NaN
dtype: float64
1    101.0
2      6.0
3      8.0
4    106.0
dtype: float64

# 判断是否为空值。
s = pd.Series([1, 2, 3, float("NaN"), np.nan])
display(s)

# 判断是否为空值。
display(s.isnull())

# 判断是否不是空值。
display(pd.notnull(s))

# np.mean, np.sum等函数,在处理ndarray数组与Series时,表现的不同。

#注意计算元素数量numpy只支持size,Series支持size和count,但只有一种写法s.count(),同样count会忽略NaN
# 对于Series,会忽略掉NaN。而numpy中的ndarray则会处理nan所以得不到正常的结果
# 用size计算元素个数时不会忽略掉NaN
a = np.array([1, 2, 3, 4, np.nan])
s = pd.Series([1, 2, 3, 4, np.nan])
display(np.mean(a),a.mean(),np.size(a),a.size)
display(np.mean(s),s.mean(),np.size(s),a.size,s.count())

nan    nan   5    5
2.5     2.5    5     5    4

发布了103 篇原创文章 · 获赞 75 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41685388/article/details/103824946
今日推荐