pandas---Series与DataFrame索引、切片;多层索引、索引的堆叠

news2024/11/16 21:58:57

1. Series的索引和切片

1.1 Series的索引:

可以使用中括号取单个索引(此时返回的是元素类型),或者中括号里一个列表取多个索引(此时

返回的仍然是一个Series类型)。分为显示索引和隐式索引:

(1) 显式索引:

使用index中的元素作为索引值

使用.loc[ ]

s = pd.Series({'Python': 150, 'NumPy': 100, 'Pandas': 130})
s
NumPy     100
Pandas    130
Python    150
dtype: int64
# 显示索引: 使用索引名
print(s['Python'])   # 值,int类型
print(s.NumPy)

# 使用2个中括号得到的类型:Series
 # 一次取多个元素
s[['Pandas', 'NumPy']] 
s[['Pandas']]

# 使用 loc[]
print(s.loc['Python'])
print(s.loc[['Pandas', 'NumPy']])
s.loc[['Pandas']]
150
100
150
Pandas    130
NumPy     100
dtype: int64
Pandas    130
dtype: int64

(2) 隐式索引:

使用整数作为索引值

使用.iloc[ ]

# 隐式索引:使用数字下标
print(s[0])
print(s[[0, 2]])
print(s[[0]])

# 使用 iloc[]
s.iloc[0]
print(s.iloc[[0, 2]])
print(s.iloc[[0]])

# 下面这2个写法是错误的
# s.iloc['Python']
# s.loc[0]
100
NumPy     100
Python    150
dtype: int64
NumPy    100
dtype: int64
NumPy     100
Python    150
dtype: int64
NumPy    100
dtype: int64

1.2 Series的切片

s = pd.Series({
    '语文': 100, 
    '数学': 150,
    '英语': 110,
    'Python': 130,
    'Pandas': 150,
    'NumPy': 150
})
# 切片
# Series是一维数组
# 隐式切片:  左闭右开
s[1 : 4]
s.iloc[1 : 4]
# 显式切片: 左闭右闭
s['数学' : 'Python']
s.loc['数学' : 'Python']
数学        150
英语        110
Python    130
dtype: int64

2. DataFrame的索引与切片

2.1 DataFrame的索引

(1) 对列进行索引:

通过类似字典的方式;通过属性的方式。

可以将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且name

属性也已经设置好了,就是相应的列名。

df = pd.DataFrame(
    data=np.random.randint(10, 100, size=(4, 6)),
    index=['小明', '小红', '小黄', '小绿'],
    columns=['语文', '数学', '英语', '化学', '物理', '生物']
)
df.语文  # Series类型
df['语文']
# 使用2个中括号得到的类型:DataFrame
df[['语文', "化学"]]
df[['语文']]

 (2) 对行进行索引:

使用.loc[ ]加index来进行行索引

使用.iloc[ ]加整数来进行行索引

同样返回一个Series,index为原来的columns。

# 不可以直接取行索引
# df['小明']
# df.小明
# DataFrame默认是先取列索引
# 取行索引
print(df.loc['小明'])  # Series类型
df.iloc[0] 
# 使用两个中括号: DataFrame类型
print(type(df.loc[['小明', '小绿']]))
df.loc[['小明']]
print(df.iloc[[0, -1]])
df.iloc[[0, 3]]
df.iloc[[0]]

(3) 对元素索引的方法:

使用列索引;使用行索引(iloc[3,1]相当于两个参数;iloc[[3,3]] 里面的[3,3]看做一个参数);

使用values属性(二维NumPy数组)。

# 先取列,再取行
print(df['语文']['小明'])
df['语文'][0]
df.语文[0]
df.语文.小明
# 先取行,再取列
df.loc['小明']['语文']
df.loc['小明'][0]
print(df.iloc[0][0])
df.iloc[0]['语文']
df.iloc[0, 0]
df.loc['小明', '语文']
36
36
36

2.2 DataFrame的切片

直接用中括号时:

索引优先对列进行操作;切片优先对行进行操作

# 行切片
print(df[1: 3])   # 左闭右开 
df['小红' : '小黄']  # 左闭右闭
print(df.iloc[1: 3])   # 左闭右开 
df.loc['小红' : '小黄']  # 左闭右闭

# 列切片
#   对列做切片,也必须先对行切片
df.iloc[ : , 1: 4]
df.loc[:, "数学": "化学"]

总结:

取一行或一列 : 索引;取连续的多行或多列 : 切片;取不连续的多行或多列 : 中括号

3. 多层索引操作

(1) 隐式构造

最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组

data = np.random.randint(0, 100, size=(6, 6))

index = [
    ['1班',  '1班',   '1班',  '2班', '2班', '2班'],
    ['张三', '李四', '王五', '鲁班', '张三丰', '张无忌']
]
columns = [
    ['期中', '期中', '期中', '期末', '期末', '期末'],
    ['语文', '数学', '英语', '语文', '数学', '英语']
]

df = pd.DataFrame(data=data, index=index, columns=columns)

Series也可以创建多层索引:

data = np.random.randint(0, 100, size=6)

index = [
    ['1班',  '1班',   '1班',  '2班', '2班', '2班'],
    ['张三', '李四', '王五', '鲁班', '张三丰', '张无忌']
]

s = pd.Series(data=data, index=index)

(2) 显示构造pd.MultiIndex

使用数组:

data = np.random.randint(0, 100, size=(6, 6))

index = pd.MultiIndex.from_arrays( [
    ['1班',  '1班',   '1班',  '2班', '2班', '2班'],
    ['张三', '李四', '王五', '鲁班', '张三丰', '张无忌']
])
columns = [
    ['期中', '期中', '期中', '期末', '期末', '期末'],
    ['语文', '数学', '英语', '语文', '数学', '英语']
]

df = pd.DataFrame(data=data, index=index, columns=columns)
df

 使用tuple:

data = np.random.randint(0, 100, size=(6, 6))

index = pd.MultiIndex.from_tuples( 
    (
        ('1班', '张三'), ('1班', '李四'), ('1班', '王五'), 
        ('2班', '鲁班'), ('2班', '张三丰'), ('2班', '张无忌')
    )
)

columns = [
    ['期中', '期中', '期中', '期末', '期末', '期末'],
    ['语文', '数学', '英语', '语文', '数学', '英语']
]

df = pd.DataFrame(data=data, index=index, columns=columns)
df

使用product:

data = np.random.randint(0, 100, size=(6, 6))

# 笛卡尔积: {a, b} {c, d} => {a, c}, {a, d}, {b, c}, {b, d}

index = pd.MultiIndex.from_product( [
    ['1班',  '2班'],
    ['张三', '李四', '王五']
])
columns = [
    ['期中', '期中', '期中', '期末', '期末', '期末'],
    ['语文', '数学', '英语', '语文', '数学', '英语']
]

df = pd.DataFrame(data=data, index=index, columns=columns)
df

注意:除了行索引index,列索引columns也能用同样的方法创建多层索引

4. 多层索引对象的索引与切片

4.1 Series的操作

对于Series来说,直接中括号[]与使用.loc()完全一样

索引:

# 显式索引
s['1班']
s.loc['1班']
s[['1班']]
s[['1班', '2班']]
s['1班']['张三']
s.loc['1班']['张三']
s.loc['1班', '张三']
s['1班', '张三']
# 隐式索引
s[0]
s[1]
s.iloc[1]
s.iloc[[1, 2]]

切片: 

# 切片
# 显式切片
s['1班' : '2班']
s.loc['1班' : '2班']
s.loc['1班'][:]
# 建议使用隐式索引
s[1 : 5]
s.iloc[1 : 5]
1班  李四     84
    王五     14
2班  鲁班     64
    张三丰    32
dtype: int32

4.2 DataFrame的操作

索引:

# 列索引
df['期中']
df['期中'][['数学']]
df['期中']['数学']
df['期中', '数学']
df.期中.数学

df.iloc[:, 2]
df.iloc[:, [0, 2, 1]]
df.loc[:, ('期中', '数学')]

# 行索引
df.loc['2班']
df.loc['2班'].loc['张三']
df.loc['2班', '张三']
df.loc[('2班', '张三')]

df.iloc[1]
df.iloc[[1]]
df.iloc[[1, 3, 4, 2]]

获取元素: 

# 获取元素
df['期中']['数学']['1班']['张三']
df['期中']['数学']['1班'][0]

df.iloc[0, 1]
df.loc[('1班', '张三'), ('期中', '数学')]
72

 切片:

# 行切片
df.iloc[1 : 5]
df.loc[('1班', '李四') : ('2班', '李四')]
df.loc['1班' : '2班']

# 列切片
df.iloc[:, 1: 5]
df.loc[:, '期中': '期末']
# df.loc[:, ('期中', '数学') : ('期末', '数学')]  # 报错

# 建议切片使用隐式索引

 5. 索引的堆叠

stack():使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。

unstack():使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。

# stack: 将列索引变成行索引
df.stack()   # 默认是将最里层的列索引变成行索引
df.stack(level=-1)
df.stack(level=1)

df2 = df.stack(level=0)
df2

 

# unstack: 将行索引变成列索引
df2.unstack()
df2.unstack(level=-1)
df2.unstack(level=2)
df2.unstack(level=1)
df2.unstack(level=0)

 使用fill_value填充:

df.unstack()
df.unstack(fill_value=0)

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/634693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

后台服务接口间大文件的流式发送和读取

文章目录 介绍代码设计代码参考客户端代码服务器端代码测试实例 介绍 使用HTTP协议进行数据流式传输是一种常见的方法。对于大文件数据传输可以使用HTTP的chunked编码或使用多部分响应来实现数据流式传输。 【HTTP的chunked编码】在发送数据的服务中,可以将数据切分…

postman接口测试学习笔记(非常详细)

目录 引言 1. 资源 2.接口测试 3. 接口返回数据和JSON详解 4.接口测试协议 5.企业接口测试的流程和方案 6. 接口测试工具以及Postman介绍 7.Postman之内置的动态参数和应用 8.接口关联 引言 接口测试工具如何选择?在我看来,Postman是一个非常值…

电商--红包活动总结

文章目录 背景表结构设计实现流程流程图流程解析流程优化 背景 这是一个来自于NFT电商项目,这是个营销策略的需求,为了快狠准,短期内刺激消费,拉动销售增加购买量。运营人员可以在平台创建红包,并且设置该红包的发放时…

Android系统视角下对APK的分析(1)- 静态分析APK文件

声明 以Android手机用户角度来看,安装各式各样的APP,基本就是从应用市场上 “搜索->下载->安装” 三连。而对Android系统来说,这就是个大工程了,因为对Android系统来说APK是“外来户”,如何安装它、有限制地支持…

【用户认证】密码加密,用户状态保存,cookie,session,token

相关概念 认证与授权 认证(authentication )是验证你的身份的过程,而授权(authorization)是验证你有权访问的过程 用户认证的逻辑 获取用户提交的用户名和密码根据用户名,查询数据库,获得完…

redis知识复习

redis知识复习 redis基础知识redis的认识一. 非关系型数据库 与 传统数据库 的区别二. 安装redis并设置自启动三. 熟悉命令行客户端四.熟悉图形化工具RDM redis的命令与数据结构一. 数据结构介绍二. redis通用命令(熟练掌握) redis的Java客户端一. Jedis…

文心一言 VS 讯飞星火 VS chatgpt (38)-- 算法导论5.4 2题

二、假设我们将球投入到b个箱子里,直到某个箱子中有两个球。每一次投掷都是独立的并且每个球落入任何箱子的机会均等。请问投球次数期望是多少? 文心一言: 这是一个典型的鸽巢原理(Pigeonhole Principle)问题。假设每次投球时&…

2023年上半年系统分析师下午真题及答案解析

试题一(25分) (试题一为必答题,试题二~五选答两题) 某软件公司拟开发一套汽车租赁系统,科学、安全和方便的管理租赁公司的各项业务,提高公司效率,提升利用率。注册用户在使用系统进行车辆预约时需执行以下操作:(a)用…

从0-1一起学习live555设计思想之二 RTSP交互过程

流媒体服务系列 文章目录 流媒体服务系列前言一、OPTION二、DESCRIBE三、SETUP四、PLAY总结前言 本篇文章通过代码去分析rtsp交互过程与工作原理。由于live555的继承关系太过复杂,所以做了个图简单记录一下与h264文件传输相关的类继承关系。 一、OPTION OPTION比较简单,就…

【调制BFSK】二进制频移键控FSK的数字调制(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

ARM学习(22)断点认识以及调试

笔者来聊聊断点以及断点的调试 1、断点原理 断电的原理一般分为两种,插入断点指令或者利用硬件调试寄存器进行断点。 前者程序如果在RAM(SRAM、DDR)上,则调试器可以直接在断点地址处插入断点指令,例如BKPT&#xff0…

python自动化测试-自动化基本技术原理

1 概述 在之前的文章里面提到过:做自动化的首要本领就是要会 透过现象看本质 ,落实到实际的IT工作中就是 透过界面看数据。 掌握上面的这样的本领可不是容易的事情,必须要有扎实的计算机理论基础,才能看到深层次的本质东西。 …

家用电器-空调制冷、制热、除霜、除湿、换新风的基本原理及实现讲解

目录 一、空调历史 二、空调的作用 三、空调类型 四、基本原理 4.1 制冷过程 4.2 制热过程 4.3 除霜过程 4.4 除湿过程 4.5 换气过程 五、电路控制系统 六、核心部件 七、基本指标 1)气候类型 2)额定制冷量 3)能效比 八、市场…

4年功能庸庸碌碌,进阶自动化测试拿到了24k,测试之路不再平凡...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 手工测试如何进阶…

多业务聚合查询设计思路与实践

文章目录 [toc] 1.需求2.方案2.1 方案架构图2.2 选用flink-cdc的原因 3.实践3.1 环境准备3.3 es集群搭建3.4 flink1.14.0环境搭建3.5 准备sql和jar包3.5.1[创建mysql的flink用户并授权](https://ververica.github.io/flink-cdc-connectors/master/content/connectors/mysql-cdc…

【树形DP+直径思想】代码源每日一题div1 三进制循环

三进制循环 - 题目 - Daimayuan Online Judge 题意: 思路: 有点像树的直径 回顾一下我们是怎么求直径的:维护根节点到其子树上的点的最大距离和次大距离,然后答案就是统计所有结点的次大值最大值 的 最大值 这道题也是一样的&a…

C盘爆满时的几个救命无害清理技巧

其实网上也有很多清理C盘的方法 但是很多就是为了弄成空间 不讲原理 也不计后果 很可能坑惨小伙伴 可以看到 我电脑的C盘都已经读红条了 非常危险 对了 可能有些朋友的电脑上没有此电脑的选项 我们可以在桌面上右键选择 个性化 找到 主题 并选择 向下拉 找到 桌面图标设置 …

经验总结:13 条自动化测试框架设计原则!

1.代码规范 测试框架随着业务推进,必然会涉及代码的二次开发,所以代码编写应符合通用规范,代码命名符合业界标准,并且代码层次清晰。特别在大型项目、多人协作型项目中,如果代码没有良好的规范,那么整个框…

微服务之负载均衡

Informal Essay By English I wish the students of the college entrance examination can win the gold toad and win the title of the gold list 参考书籍:“凤凰架构” 负载均衡(load balance) 负载平衡是指在一组后端服务器&#xf…

《计算机网络——自顶向下方法》精炼——4.4.1-4.4.2

敬教劝学,建国之大本;兴贤育才,为政之先务。——《朱舜水集。劝学》 文章目录 IPv4编址接口IP地址子网 无类别域间路由选择(CIDR)获取一块地址获取主机地址网络地址转换 IPv4编址 接口 主机或路由器与物理链路的边界称作接口。一…