当前位置: 首页 > news >正文

【数据分析专栏之Python篇】五、pandas数据结构之Series

前言

大家好!本期跟大家分享的知识是 Pandas 数据结构—Series。

一、Series的创建

Series 是一种类似于一维数组的对象,由下面两部分组成:

  • values:一组数据,ndarray 类型
  • index:数据索引

image-20230727092138996

顾名思义,我们在创建 Series 对象时,需要传递一组数据,该数据大多数时候是可迭代对象。因此,下面三种创建方式都是将数据传入到 Series 方法中。

1.1 列表数组创建

以列表作为数据创建 Series。

list1 = list('ABCD') # 创建列表
s =pd.Series(list1) # 传递列表数据到 Series 方法中
print(s)
print(type(s.values))
print(type(s.index))
###########结果###########
0    A
1    B
2    C
3    D
dtype: object
<class 'numpy.ndarray'>
<class 'pandas.core.indexes.range.RangeIndex'>

以数组作为数据创建 Series。

n = np.array(range(5,10))
s2 = pd.Series(n)
s2
###########结果###########
0    5
1    6
2    7
3    8
4    9
dtype: int32

1.2 字典创建

前两种方式,都是只传递了数据,那么索引是默认索引(0 ~ N-1);下面的字典创建方式,则是以字典的键为索引,字典的值为数据。

d = {
'a':11,'b':22,'c':33,'d':44
}
s = pd.Series(d)
s
###########结果###########
a    11
b    22
c    33
d    44
dtype: int64

1.3 通过标量创建

s = pd.Series(100,index=range(5))
s
###########结果###########
0    100
1    100
2    100
3    100
4    100
dtype: int64

二、Series索引

从以上 Series 的创建中我们可以看出,Series 的索引是可以修改的 。我们先来探讨以下索引的作用。

  • 获取元素:有多种获取方式,s.索引名,s[‘索引名’],s.loc[‘索引名’]

  • 允许修改:(为 s.index 重新赋值即可,注意前后数量一致)

显式即表示使用索引名称的方式,隐式即表示使用序号的方式。后面的显式切片和隐式切片也是同理。

2.1 显式索引

取单个值时,三种方式:(假设 Series 对象名为 s

  • s.索引名(数字索引不能用这种方式)
  • s[‘索引名’]
  • s.loc[‘索引名’]

取多个值时,返回一个新的 Series 对象,两种方式(也就是加中括号):

  • s.[[‘索引名1’,‘索引名2’]]
  • s.loc[[‘索引名1’,‘索引名2’]]
s = pd.Series(np.array(range(5,10)),index=list('abcde'),name='number')
print(s)
display(s.a,s['a'],s.loc['a'])
###########结果###########
a    5
b    6
c    7
d    8
e    9
Name: number, dtype: int32555

2.2 隐式索引

隐式索引和显示索引的区别就是它通过数字来获取值。因为是数字,因此 s.number 这种方式肯定 不能用了 ,其他都相同。

取单值,两种方式

  • s[number]
  • s.iloc[number]

取多值,两种方式

  • s[[number1,number2]]
  • s.iloc[[number1,number2]]
s = pd.Series(np.array(range(5,10)),index=list('abcde'),name='number')
print(s)
print('取单值')
print(s[1])
print(s.iloc[1])
print('取多值')
print(s[[1,2]])
print(s.iloc[[1,2]])
###########结果###########
a    5
b    6
c    7
d    8
e    9
Name: number, dtype: int32
a    5
b    6
c    7
d    8
e    9
Name: number, dtype: int32
取单值
6
6
取多值
b    6
c    7
Name: number, dtype: int32
b    6
c    7
Name: number, dtype: int32

三、Series切片

切片操作是获取一个新的 Series 对象的操作,显式切片是为左闭右闭,隐式切片时为左闭右开

2.1 显式切片

两种方式:

  • s[索引名1:索引名2]
  • s.loc[索引名1:索引名2]

2.2 隐式切片

两种方式:

  • s[number1:number2]
  • s.iloc[number1:number2]
s = pd.Series({
'yw':100,
'math':150,
'eng':110,
'Python':130
})
print('数据:',end='')
print('-'*10)
print(s)
print('-'*10)
print('显式切片')
print(s['yw':'math'])
print('-'*10)
print(s.loc['yw':'math'])
print('-'*10)
print('隐式切片')
print(s[0:1])
print('-'*10)
print(s.iloc[0:1])
###########结果###########
数据:----------
yw        100
math      150
eng       110
Python    130
dtype: int64
----------
显式切片
yw      100
math    150
dtype: int64
----------
yw      100
math    150
dtype: int64
----------
隐式切片
yw    100
dtype: int64
----------
yw    100
dtype: int64

四、Series基本属性和方法

Series基本属性和方法是让我们更好了解数据组成的手段。

4.1 属性

属性作用
s.shape查看数据行列
s.ndim查看维度,Series 就是一维,ndim 恒等于1
s.size查看数据总数
s.index查看索引
s.values查看数据
s.name查看 Series 对象的 name,若未设定则为空

4.2 方法

方法功能
s.head()查看前5条数据,若传入数字 n ,则查看前 n 条
s.tail()查看后5条数据,若传入数字 n ,则查看后 n 条
s.isnull()判断数据是否为空,空的为 True ,不空的为 False
s.notnull()判断数据是否不空,空的为 False ,不空的为 True

4.3 案例——使用 bool 值去除空值

原理:Series 切片可以再传入一个 Series 对象,该 Series 对象索引要和原来相同,那么值为 False 的将不会被取出。

请看示例:

s = pd.Series(['a','e','f','b'])
s[pd.Series([True,True,False,True])]
###########结果###########
0    a
1    e
3    b
dtype: object

如果改为:

s = pd.Series(['a','e','f','b'])
s[pd.Series([True,True,False,True],index=list('abcd'))]
###########结果###########

那么将会报错:

IndexingError                             Traceback (most recent call last)
E:\Temp/ipykernel_15804/3537358820.py in <module>1 s = pd.Series(['a','e','f','b'])
----> 2 s[pd.Series([True,True,False,True],index=list('abcd'))]D:\PF\Anaconda3\lib\site-packages\pandas\core\series.py in __getitem__(self, key)1001 1002         if com.is_bool_indexer(key):
-> 1003             key = check_bool_indexer(self.index, key)1004             key = np.asarray(key, dtype=bool)1005             return self._get_values(key)D:\PF\Anaconda3\lib\site-packages\pandas\core\indexing.py in check_bool_indexer(index, key)2550         indexer = result.index.get_indexer_for(index)2551         if -1 in indexer:
-> 2552             raise IndexingError(2553                 "Unalignable boolean Series provided as "2554                 "indexer (index of the boolean Series and of "IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).

下面是 Series 去除空值的案例。

s = pd.Series(['zhangsan','lisi','a',np.NAN,None])
print('数据:'+'-'*10)
print(s)
conditon = s.isnull()
print('判空情况:'+'-'*10)
print(conditon)
# 使用 bool 值索引过滤数据
s = s[~conditon]
print('过滤结果:'+'-'*10)
print(s)
###########结果###########
数据:----------
0    zhangsan
1        lisi
2           a
3         NaN
4        None
dtype: object
判空情况:----------
0    False
1    False
2    False
3     True
4     True
dtype: bool
过滤结果:----------
0    zhangsan
1        lisi
2           a
dtype: object

五、Series运算

Series 运算包括算术运算和 Series 对象之间运算。算术运算是针对每一个元素的,有 +、-、*、/、 //、 %、 ** 等,这里不再赘述。Series 对象间的运算,只要记住,索引一个有一个没有时,计算值为 NaN,其他按照算术运算计算即可。

  • 算术运算
s = pd.Series(np.array(range(5,10)))
print(s)
s * 10
###########结果###########
0    5
1    6
2    7
3    8
4    9
dtype: int320    50
1    60
2    70
3    80
4    90
dtype: int32
  • Series对象间的运算
s1 = pd.Series(np.array(range(5,10)))
s2 = pd.Series([3,6,10,12])
print(s1)
print(s2)
s1 + s2 # 索引一个有一个没有时,计算值为 NaN
###########结果###########
0    5
1    6
2    7
3    8
4    9
dtype: int32
0     3
1     6
2    10
3    12
dtype: int640     8.0
1    12.0
2    17.0
3    20.0
4     NaN
dtype: float64

六、Series多层行索引

6.1 Series多层索引的构建

Series 不仅支持单层索引,还支持多层索引。最简单的实现方式就是将 index 设置成多维。

下面以二级行索引为例:

s = pd.Series(np.random.randint(60,100,6),index=[['语文','语文','语文','数学','数学','数学'],['小明','小红','小丽','小明','小红','小丽']])
print(s)
###########结果###########
语文  小明    90小红    72小丽    97
数学  小明    81小红    74小丽    84
dtype: int32

6.2 Series多层索引的索引和切片操作

对于 Series 多层索引的索引和切片操作,只要记住以下两点:

  • 要先取第一层,再取第二层,不能直接取第二层索引
  • 获取到第一层之后,就是一个普通的单层索引 Series
  • 隐式索引,直接得到数

具体的方式,还是索引和切片都分为显式和隐式,下面通过一个案例来演示。

索引:

s = pd.Series(np.random.randint(60,100,6),index=[['语文','语文','语文','数学','数学','数学'],['小明','小红','小丽','小明','小红','小丽']])
print(s)
# 索引
print('显式索引:'+'-'*10)
print(s['语文']) # 获取到单层 Series
print(s.loc['语文']) 
print(s['语文']['小明'],s.loc['语文']['小明']) # 获取到单个值
print('隐式索引:'+'-'*10)
print(s.iloc[0])
print(s[0]) # 获取到单个值
###########结果###########
语文  小明    94小红    95小丽    60
数学  小明    66小红    84小丽    76
dtype: int32
显式索引:----------
小明    94
小红    95
小丽    60
dtype: int32
小明    94
小红    95
小丽    60
dtype: int32
94 94
隐式索引:----------
94
94

切片:

s = pd.Series(np.random.randint(60,100,6),index=[['语文','语文','语文','数学','数学','数学'],['小明','小红','小丽','小明','小红','小丽']])
s = s.sort_index()
print(s)
print('显式切片'+'-'*10)
print(s['数学':'语文'])
print(s.loc['数学':'语文'])
print('隐式切片'+'-'*10)
print(s[0:2])
print(s.iloc[0:2])
###########结果###########
数学  小丽    67小明    64小红    92
语文  小丽    84小明    99小红    82
dtype: int32
显式切片----------
数学  小丽    67小明    64小红    92
语文  小丽    84小明    99小红    82
dtype: int32
数学  小丽    67小明    64小红    92
语文  小丽    84小明    99小红    82
dtype: int32
隐式切片----------
数学  小丽    67小明    64
dtype: int32
数学  小丽    67小明    64
dtype: int32

结语

💕 本期跟大家分享的 “芝士” 就到此结束了,关于 Series 数据结构,你学会了吗?✨

🍻 我是南晨曦,在学习的路上一直前行,期待与你一起进步。~ 🍻

🔥如果文中有些地方不清楚的话,欢迎联系我,我会给大家提供思路及解答。🔥

参考文档

python数据分析:Pandas之Series

相关文章:

【数据分析专栏之Python篇】五、pandas数据结构之Series

前言 大家好&#xff01;本期跟大家分享的知识是 Pandas 数据结构—Series。 一、Series的创建 Series 是一种类似于一维数组的对象&#xff0c;由下面两部分组成&#xff1a; values&#xff1a;一组数据&#xff0c;ndarray 类型index&#xff1a;数据索引 顾名思义&…...

中间件多版本冲突的4种解决方案和我们的选择

背景 在小小的公司里面&#xff0c;挖呀挖呀挖。最近又挖到坑里去了。一个稳定运行多年的应用&#xff0c;需要在里面支持多个版本的中间件客户端&#xff1b;而多个版本的客户端在一个应用里运行时会有同名类冲突的矛盾。在经过询问chatGPT&#xff0c;百度&#xff0c;googl…...

对 async/await 的理解

async/await 的理解 async/await 其实是 Generator 的语法糖&#xff0c;它能实现的效果都能用then 链来实现&#xff0c;它是为优化 then 链而开发出来的。从字面上来看&#xff0c;async 是“异步”的简写&#xff0c;await 则为等待&#xff0c;所以很好理解async用于申明一…...

Vue 整合 Element UI 、路由嵌套、参数传递、重定向、404和路由钩子(五)

一、整合 Element UI 1.1 工程初始化 使用管理员的模式进入 cmd 的命令行模式&#xff0c;创建一个名为 hello-vue 的工程&#xff0c;命令为&#xff1a; # 1、目录切换 cd F:\idea_home\vue# 2、项目的初始化&#xff0c;记得一路的 no vue init webpack hello-vue 1.2 安装…...

修改 Ubuntu 系统的时区

修改 Ubuntu 系统的时区 如果 Ubuntu 系统的时区设置不正确&#xff0c;您可以按照以下步骤进行调整&#xff1a; 1. 查看当前的时区设置&#xff0c;可以使用以下命令&#xff1a; timedatectl 这将显示当前系统的日期、时间和时区信息。 2. 如果时区设置不正…...

如何离线安装ModHeader - Modify HTTP headers Chrome插件?

如何离线安装ModHeader - Modify HTTP headers Chrome插件&#xff1f; 1.1 前言1.2 打开Chrome浏览器的开发者模式1.3 下载并解压打包好的插件1.4 解压下载好的压缩包1.5 加载插件1.6 如何使用插件? 1.1 前言 ModHeader 是一个非常好用的Chrome浏览器插件&#xff0c;可以用…...

在Linux中安装MySQL

在Linux中安装MySQL 检测当前系统中是否安装MySQL数据库 命令作用rpm -qa查询当前系统中安装的所有软件rpm -qa|grep mysql查询当前系统中安装的名称带mysql的软件rpm -qa | grep mariadb查询当前系统中安装的名称带mariadb的软件 RPM ( Red-Hat Package Manager )RPM软件包管理…...

python --windows获取启动文件夹路径/获取当前用户名/添加自启动文件

如何使用Python获取计算机用户名 一、Python自带的getpass模块可以用于获取用户输入的密码&#xff0c;但是它同样可以用来获取计算机用户名。 import getpassuser getpass.getuser() print("计算机用户名为&#xff1a;", user)二、使用os模块获取用户名 Python的…...

微信云托管(本地调试)⑥:nginx、vue刷新404问题

一、nginx默认路径 1.1、默认配置文件路径&#xff1a;/etc/nginx/nginx.conf 1.2、默认资源路径&#xff1a;/usr/share/nginx/html/index.html 二、修改nginx.conf配置 &#xff08;注意配置中的&#xff1a;include /etc/nginx/conf.d/*.conf; 里面包了一个server配置文件…...

数据结构 二叉树(一篇基本掌握)

绪论 雄关漫道真如铁&#xff0c;而今迈步从头越。 本章将开始学习二叉树&#xff08;全文共一万两千字&#xff09;&#xff0c;二叉树相较于前面的数据结构来说难度会有许多的攀升&#xff0c;但只要跟着本篇博客深入的学习也可以基本的掌握基础二叉树。 话不多说安全带系好&…...

​可视化绘图技巧100篇高级篇(四)-南丁格尔玫瑰图(二)

目录 前言 适用场景 不适用场景 ​堆积式南丁格尔玫瑰图( Nightingale Rose Diagram)...

Stable Diffusion - Candy Land (糖果世界) LoRA 提示词配置与效果展示

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132145248 糖果世界 (Candy Land) 是一个充满甜蜜和奇幻的地方&#xff0c;由各种各样的糖果和巧克力构成。在糖果世界&#xff0c;可以看到&…...

ES6学习-module语法

Module语法 CommonJS模块 let { readfile } require(fs) # 等同于 let _fs require(fs) let readfile _fs.readfile //这种加载称为“运行时加载”ES6模块 import { stat, exists, readFile } from fs;这种加载称为“编译时加载”或者静态加载 静态加载带来的各种好处 …...

Flutter 实现按位置大小比例布局的控件

文章目录 前言一、如何实现&#xff1f;1、数值转成分数2、RowFlexible布局横向3、ColumnFlexible布局纵向 二、完整代码三、使用示例1、基本用法2、四分屏3、六分屏4、八分屏5、九分屏6、414分屏 总结 前言 做视频监控项目时需要需要展示多分屏&#xff0c;比如2x2、3x3、414…...

ES6 - 对象新增的一些常用方法

文章目录 1&#xff0c;Object.is()2&#xff0c;Object.asign()3&#xff0c;Object.getOwnPropertyDescriptors()4&#xff0c;Object.setPrototypeOf()和getPrototypeOf()5&#xff0c;Object.keys()、values() 和 entries()6&#xff0c;Object.fromEntries()7&#xff0c;…...

半导体存储电路

存储电路 存储单元&#xff1a;只能存储一位数据 寄存器&#xff1a;存储一组数据 存储单元 静态存储单元&#xff1a;包含锁存器和触发器&#xff0c;只要不断电&#xff0c;静态存储单元的状态会一直保持下去。 动态存储单元&#xff1a;利用电容的电荷存储效应来存储数据。…...

web前端之CSS操作

文章目录 一、CSS操作1.1 html元素的style属性1.2 元素节点的style属性1.3 cssText属性 二、事件2.1 事件处理程序2.1.1 html事件2.1.2 DOM0事件&#xff08;适合单个事件&#xff09;2.1.3 DOM2事件&#xff08;适合多个事件&#xff09; 2.2 事件之鼠标事件2.3 事件之Event事…...

Python SQLAlchemy ( ORM )

From Python中强大的通用ORM框架&#xff1a;SQLAlchemy&#xff1a;https://zhuanlan.zhihu.com/p/444930067Python ORM之SQLAlchemy全面指南&#xff1a;https://zhuanlan.zhihu.com/p/387078089 SQLAlchemy 文档&#xff1a;https://www.sqlalchemy.org/ SQLAlchemy入门和…...

鉴源实验室丨汽车网络安全运营

作者 | 苏少博 上海控安可信软件创新研究院汽车网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 概 述 1.1 背景 随着车辆技术的不断进步和智能化水平的提升&#xff0c;车辆行业正经历着快速的变革和技术进步。智能化…...

分布式链路追踪之SkyWalking详解和实战

SkyWalking 文章目录 SkyWalking1.SkyWalking概述2.SkyWalking架构设计3.SkyWalking部署4.应用程序接入SkyWalking5.SkyWalking配置应用告警5.1.告警规则5.2.Webhook&#xff08;网络钩子&#xff09;5.3.邮件告警实践 6.项目自动化部署接入SkyWalking6.1 整体思路6.2 启动参数…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...