Pandas基础02(DataFrame创建/索引/切片/属性/方法/层次化索引)
DataFrame数据结构
DataFrame 是一个二维表格的数据结构,类似于数据库中的表格或 Excel 工作表。它由多个 Series 组成,每个 Series 共享相同的索引。DataFrame 可以看作是具有列名和行索引的二维数组。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。
3.2.1 DataFrame的创建
最常用的方法是传递一个字典来创建。DataFrame以字典的键作为每一【列】的名称,以字典的值(一个数组)作为每一列。DataFrame会自动加上每一行的索引(和Series一样)。同Series一样,若传入的列与字典的键不匹配,则相应的值为NaN。
pd.DataFrame(data=None,index: 'Axes | None' = None,columns: 'Axes | None' = None,dtype: 'Dtype | None' = None,copy: 'bool | None' = None,
) -> 'None'
- 通过字典直接创建,行索引默认为0~N-1
aDict = {"Chinese":[100, 102, 108, 95, 88],"Math":[120, 118, 102, 98, 114],"English":[64, 98, 115, 102, 96]
}d = pd.DataFrame(aDict)
d
>>> Chinese Math English
0 100 120 64
1 102 118 98
2 108 102 115
3 95 98 102
4 88 114 96
- 指通过numpy二维数组创建
df = pd.DataFrame(np.random.randint(1, 10, (3, 4)), index=['a', 'b', 'c'], columns=['A', 'B', 'C', 'D'])
3.2.2 DataFrame的基本属性与方法
df = pd.DataFrame(np.random.randint(1, 10, (3, 4)), index=['a', 'b', 'c'], columns=['A', 'B', 'C', 'D'])
- values值:二维ndarray数组
df.values
>>> ndarray类型的二维数组
array([[7, 5, 3, 6],[6, 1, 2, 3],[5, 6, 6, 1]])
- columns:列索引
df.columns
>>> Index(['A', 'B', 'C', 'D'], dtype='object')
- index:行索引
df.index
>>> Index(['a', 'b', 'c'], dtype='object')
- shape:形状
df.shape
>>> (3, 4)
- head():查看前几条数据,默认5条
df.head(2)
- tail():查看后几条数据,默认5条
df.tail(2)
3.2.3 DataFrame的索引
索引优先对列进行操作,然后对行操作
df = pd.DataFrame(np.random.randint(1, 100, (3, 4)), index=['zs', 'ls', 'ww'], columns=['语文', '数学', '英语', '计算机'])
- 对列进行索引:返回列的Series对象
# 1.通过字典的方式取值
print(df['语文'])
print(df[['数学', '计算机']])
# 2.通过属性的方式取值
print(df.语文)
- 对行进行索引:返回行的Series对象
# 1.使用.loc[行索引名称]进行索引
print(df.loc['zs'])
print(df.loc[['zs', 'ww']])
# 2.使用.iloc[行索引整数]进行索引
print(df.iloc[0])
print(df.iloc[[1, 2]])
- 取DataFrame中的元素:返回元素的值
# 方法,用取列或取行的方式取到Series对象,之后和Series对象的去元素方法一致
# 先去列,再取行
print(df['语文']['zs'])
print(df.语文[0])
print(df.语文.zs)
print(df['语文'].iloc[0])
print(df['语文'].loc['zs'])
# 先取行,再取列
print(df.loc['zs']['语文'])
print(df.loc['zs', '语文'])
print(df.loc['zs'].语文)
print(df.iloc[0][0])
print(df.iloc[0, 0])
3.2.4 DataFrame的切片操作
- 切片:优先对行进行切片
# 1.行切片
print(df[1:3]) #直接切片:左闭右开
print(df.iloc[1:3]) #左闭右开
print(df["zs":"ls"]) #通过索引名切片,左闭右闭
print(df.loc['zs':'ls']) #左闭右闭# 2.列切片
# 列切片之前必须行切片,且只可以iloc和loc
print(df.iloc[:, 1:4])
print(df.loc[:, '数学':'计算机'])# 3.同时对行和列切片
print(df.iloc[1:3, 1:4])# 4.索引和切片一起使用
print(df.iloc[0, 1:3])
3.2.5 DataFrame运算
- 基本代数运算:所有元素均作相关运算
df = pd.DataFrame(np.random.randint(50, 100, (3, 4)), index=['zs', 'ls', 'ww'], columns=['语文', '数学', '英语', '计算机'])
print(df + 100)
print(df - 100)
print(df * 100)
print(df / 100)
print(df // 2)
print(df ** 2)
print(df % 2)
- DataFrame与DataFrame的运算
- 在运算中自动对齐索引
- 如果索引不对应,则补NaN
- DataFrame没有广播机制
df1 = pd.DataFrame(np.random.randint(50, 100, (3, 4)), index=['zs', 'ls', 'ww'], columns=['语文', '数学', '英语', '计算机'])
df2 = pd.DataFrame(np.random.randint(50, 100, (3, 4)), index=['zs', 'ls', 'ww'], columns=['语文', '数学', '英语', '计算机'])#对应索引相同元素相加
df1 + df2 #索引不相同时,索引不对应处为NaN
df3 = pd.DataFrame(np.random.randint(50, 100, (4, 5)), index=['zs', 'ls', 'ww', 'zl'], columns=['语文', '数学', '英语', '计算机', '软件开发'])
df1 + df3数学 英语 计算机 语文 软件开发
ls 138.0 141.0 123.0 138.0 NaN
ww 128.0 135.0 161.0 173.0 NaN
zl NaN NaN NaN NaN NaN
zs 132.0 111.0 162.0 146.0 NaN
#如果想要保留索引的值,不想出现NaN则需要调用add()函数
df1.add(df3, fill_value=0)数学 英语 计算机 语文 软件开发
ls 138.0 141.0 123.0 138.0 79.0
ww 128.0 135.0 161.0 173.0 64.0
zl 60.0 78.0 66.0 98.0 65.0
zs 132.0 111.0 162.0 146.0 65.0
- Series与DataFrame的运算
使用Pandas操作函数:
1.当axis=1:以列为单位操作(参数必须是列),对所有列都有效。(默认)
df1 = pd.DataFrame(np.random.randint(50, 100, (3, 4)), index=['zs', 'ls', 'ww'], columns=['语文', '数学', '英语', '计算机'])
s = pd.Series(np.random.randint(50, 100, (4,)), index=df1.columns)
print(df1 + s)
print(df1.add(s, axis=1))2.当axis=0:以行为单位操作(参数必须是行),对所有行都有效。
df1 = pd.DataFrame(np.random.randint(50, 100, (3, 4)), index=['zs', 'ls', 'ww'], columns=['语文', '数学', '英语', '计算机'])
s = pd.Series(np.random.randint(50, 100, (3,)), index=df1.index)
print(df1.add(s, axis=0))
3.3 层次化索引
Pandas 的层次化索引(Hierarchical Indexing)允许在一个 DataFrame 或 Series 中使用多个索引级别。这意味着数据可以在多个维度上进行组织和操作。通过层次化索引,可以简化复杂的数据结构,并提高对数据的访问效率。
3.1.1 层次化索引的创建
- 隐式创建:
DataFrame:最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组
data = np.random.randint(0, 100, (4, 4))
#这里“2214班”与“zhangsan”,“lisi”对应,“2215班”与"wangwu","zhaoliu"对应
index = [["2214班","2214班","2215班","2215班"],["zhangsan", "lisi", "wangwu", "zhaoliu"]
]columns = [["第一学期","第一学期","第二学期","第二学期"],["加权成绩", "平均成绩","加权成绩", "平均成绩"]
]df = pd.DataFrame(data, index=index, columns=columns)
df

Series:
data = np.random.randint(0, 100, (4, ))
index = [["2214班","2214班","2215班","2215班"],["zhangsan", "lisi", "wangwu", "zhaoliu"]
]
s = pd.Series(data=data, index=index)
s2214班 zhangsan 85lisi 98
2215班 wangwu 24zhaoliu 19
dtype: int32
- 显示创建:
1.使用数组创建:pd.MultiIndex.from_arrays()
# 使用数组创建
data = np.random.randint(0, 100, (4, 4))
index = pd.MultiIndex.from_arrays([["2214班","2214班","2215班","2215班"],["zhangsan", "lisi", "wangwu", "zhaoliu"]
])columns = pd.MultiIndex.from_arrays([["第一学期","第一学期","第二学期","第二学期"],["加权成绩", "平均成绩","加权成绩", "平均成绩"]
])df = pd.DataFrame(data, index=index, columns=columns)
df
2.使用元组创建:pd.MultiIndex.from_tuples()
# 使用元组创建
data = np.random.randint(0, 100, (4, 4))
index = pd.MultiIndex.from_tuples((("2214班","zhangsan"),("2214班","lisi"),("2215班","wangwu"),("2215班","zhaoliu"))
) columns = pd.MultiIndex.from_tuples((("第一学期","加权成绩"),("第一学期","平均成绩"),("第二学期","加权成绩"),("第二学期","平均成绩"))
)df = pd.DataFrame(data, index=index, columns=columns)
df
3.使用笛卡尔积创建:pd.MultiIndex.from_product()
使用数组创建
data = np.random.randint(0, 100, (4, 4))
index = pd.MultiIndex.from_arrays([["2214班","2214班","2215班","2215班"],["zhangsan", "lisi", "wangwu", "zhaoliu"]
])columns = pd.MultiIndex.from_product([["第一学期","第二学期"],["加权成绩", "平均成绩"]
])df = pd.DataFrame(data, index=index, columns=columns)
df
3.1.2 层次化索引与切片
- Series类型
data = np.random.randint(0, 100, (4, ))
index = [["A2214班","A2214班","A2215班","A2215班"],["zhangsan", "lisi", "wangwu", "zhaoliu"]
]
s = pd.Series(data=data, index=index)
s
(1)索引
# 显示索引
#层次化索引需要依次访问每层索引以获取该索引下的Series
print(s['A2214班'])
print(s['A2214班']['zhangsan'])
print(s['A2214班', 'zhangsan'])
print(s['A2214班'][0])
print(s['A2214班'][['zhangsan', 'lisi']])
print(s.loc['A2214班'])
print(s.A2214班)# 隐式索引:与Series的访问方式一致,无需考虑层次化索引
print(s[0])
print(s.iloc[0])
(2)切片
# 显式切片:需要一层层索引依次切片,不可跨索引切片
s['A2214班':'A2215班']
s['A2214班'][:]
s['zhangsan':'lisi'] #Series([], dtype: int32)#隐式切片:同Series的切片方式相同
s[0:3]
s.iloc[0:2]
- DataFrame类型
data = np.random.randint(0, 100, (4, 4))
index = pd.MultiIndex.from_arrays([["A2214班","A2214班","A2215班","A2215班"],["zhangsan", "lisi", "wangwu", "zhaoliu"]
])columns = pd.MultiIndex.from_product([["第一学期","第二学期"],["加权成绩", "平均成绩"]
])df = pd.DataFrame(data, index=index, columns=columns)
df
(1)索引:先列后行
# 对列进行索引(默认):若索引包含多行返回DataFrame,若索引只包括单行返回Serires
# 1.显示索引:需要一层层索引访问
df['第一学期']
df['第一学期']['加权成绩']
df.第一学期
df[['第一学期','第二学期']]# 2.隐式索引: 无需考虑多次索引,但要先访问行
df.iloc[:,0]# 对行进行索引:若索引包含多行返回DataFrame,若索引只包括单行返回Serires
# 1.显示索引:需要一层层索引访问
df.loc['A2214班']
df.loc['A2214班'].loc['zhangsan']# 2.隐式索引:无需考虑多次索引
df.iloc[2]
(2)切片:先行后列(建议使用隐式索引)
# 行切片
df.iloc[0:3]
# 列切片
df.iloc[, 0:3]
3.1.3 索引的堆叠
索引堆叠通常指的是对 DataFrame 或 Series 的 层次化索引(MultiIndex) 进行堆叠和展开操作。这种操作可以将数据的索引层级转换,或是将数据的多个层级组合成一个新的层级。
- stack(level: ‘Level’ = -1):将列转为行
# 默认;level=-1是将列的最后一层索引转变为行的最后一层索引
# level=n是将列的最后n层索引转变为行的最后一层索引
# 执行后,返回的 DataFrame 会有一个层次化的索引,原本的DataFrame不改变
data = np.random.randint(0, 100, (4, 4))
index = pd.MultiIndex.from_arrays([["2214班","2214班","2215班","2215班"],["zhangsan", "lisi", "wangwu", "zhaoliu"]
])columns = pd.MultiIndex.from_product([["第一学期","第二学期"],["加权成绩", "平均成绩"]
])df = pd.DataFrame(data, index=index, columns=columns)
display(df, df.stack())
- unstack():将行转为列
df.unstack() #默认将行的最后一个索引转换为列的最后一个索引,由于2214班无wangwu等人所以会NaN填写空缺

3.1.4 索引的聚合

# 每一行相加:axis = 0(默认)
print(df.sum())
print(df.sum(axis=0))
print(df.sum(axis=0, level=0)) #计算行的第0层索引对应的和
print(df.sum(axis=0, level=1)) #计算行的第1层索引对应的和# 每一列相加:axis = 1
print(df.sum(axis=1, level=0)) #计算列的第0层索引对应的和
print(df.sum(axis=1, level=1)) #计算列的第1层索引对应的和# # 所有元素之和
df.values.sum()
相关文章:
Pandas基础02(DataFrame创建/索引/切片/属性/方法/层次化索引)
DataFrame数据结构 DataFrame 是一个二维表格的数据结构,类似于数据库中的表格或 Excel 工作表。它由多个 Series 组成,每个 Series 共享相同的索引。DataFrame 可以看作是具有列名和行索引的二维数组。设计初衷是将Series的使用场景从一维拓展到多维。…...
Meta-CoT:通过元链式思考增强大型语言模型的推理能力
大型语言模型(LLMs)在处理复杂推理任务时面临挑战,这突显了其在模拟人类认知中的不足。尽管 LLMs 擅长生成连贯文本和解决简单问题,但在需要逻辑推理、迭代方法和结果验证的复杂任务(如高级数学问题和抽象问题解决&…...
【时时三省】(C语言基础)二进制输入输出
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 二进制输入 用fread可以读取fwrite输入的内容 字符串以文本的形式写进去的时候,和以二进制写进去的内容是一样的 整数和浮点型以二进制写进去是不一样的 二进制输出 fwrite 字…...
【go语言】数组和切片
一、数组 1.1 什么是数组 数组是一组数:数组需要是相同类型的数据的集合;数组是需要定义大小的;数组一旦定义了大小是不可以改变的。 1.2 数组的声明 数组和其他变量定义没有什么区别,唯一的就是这个是一组数,需要给…...
10.片元
**片元(Fragment)**是渲染管线中的一个重要概念,可以理解为“潜在的像素”。用通俗易懂的方式来解释: 通俗解释:片元就像候选的颜料点 想象你是一个画家,正在画一幅画: 片元是候选的颜料点&…...
SQL-leetcode—1179. 重新格式化部门表
1179. 重新格式化部门表 表 Department: ---------------------- | Column Name | Type | ---------------------- | id | int | | revenue | int | | month | varchar | ---------------------- 在 SQL 中,(id, month) 是表的联合主键。 这个表格有关…...
k8s简介,k8s环境搭建
目录 K8s简介环境搭建和准备工作修改主机名(所有节点)配置静态IP(所有节点)关闭防火墙和seLinux,清除iptables规则(所有节点)关闭交换分区(所有节点)修改/etc/hosts文件&…...
Docker常用知识点问题
1.dockerfile基础命令及作用 —copy和add区别 —为什么要指定workdir —expose作用,能不能不用,不用会导致什么情况? —env,不用怎么打镜像 —from 2.dockerfile编写规范 —jdk版本 —依赖问题 —shell指令引用 —字体和时区配置 …...
基于微信小程序的网上订餐管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
Java使用FFM API调用SDL
首发于Enaium的个人博客 首先我们需要创建一个Gradle项目,之后设置项目的JDK版本,设置为22及以上版本。 plugins {kotlin("jvm") version "2.1.0" }group "cn.enaium" version "1.0-SNAPSHOT"repositories {…...
java入门基础笔记语法篇(3)
一、 注释 什么是注释 注释定义:注释是写在程序中对代码进行解释说明的文字,方便自己和他人查看以理解程序。 Java注释的三种写法: 单行注释:以“//”开头,注释内容只能写一行。多行注释:以“/*”开头&…...
【数据结构】深入解析:构建父子节点树形数据结构并返回前端
树形数据结构列表 一、前言二、测试数据生成三、树形代码3.1、获取根节点3.2、遍历根节点,递归获取所有子节点3.3、排序3.4、完整代码 一、前言 返回前端VO对象中,有列情况列表展示需要带树形结构,例如基于RBAC权限模型中的菜单返回…...
JAVA 使用反射比较对象属性的变化,记录修改日志。使用注解【策略模式】,来进行不同属性枚举值到中英文描述的切换,支持前端国际化。
1.首先定义一个接口,接口中有两个方法,分别是将属性转换成英文描述和中文描述。 其实就是将数据库中记录的 0 1 ,转换成后面的描述 这边定义了中文转换为默认方法,是因为有些属性不需要进行中文转换,或者该属性的枚举…...
第27章 测试驱动开发模式:深入测试技术
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
基于模糊PID的孵化箱温度控制系统(论文+源码)
1系统方案设计 本课题为基于模糊PID的孵化箱温度控制系统,其以STM32最小系统与模糊PID控制器为控制核心。系统主要包括数据采集模块、处理器模块、电机控制模块。 数据采集模块由温度传感器构成,通过温度传感器感应温度变化,获得待处理的数据…...
机器学习-数据集划分
文章目录 一. 为什么要划分数据集二. 数据集划分的方法1. 留出法:2. 交叉验证:将数据集划分为训练集,验证集,测试集3. 留一法:4. 自助法: 一. 为什么要划分数据集 为了能够评估模型的泛化能力,可…...
C++ 可变函数和参数
写一个函数,函数的参数是函数对象及参数,功能和thread类的构造函数相同。 代码示例: #include <iostream>#include <thread>#include <functional> using namespace std;void show0() { // 普通函数。cout <&…...
Hive之加载csv格式数据到hive
场景: 今天接了一个需求,将测试环境的hive数据导入到正式环境中。但是不需要整个流程的迁移,只需要迁移ads表 解决方案: 拿到这个需求首先想到两个方案: 1、将数据通过insert into语句导出,然后运行脚本 …...
C# OpenCV机器视觉:利用CNN实现快速模板匹配
在一个阳光灿烂的周末,阿强正瘫在沙发上,百无聊赖地换着电视频道。突然,一则新闻吸引了他的注意:某博物馆里一幅珍贵的古画离奇失踪,警方怀疑是被一伙狡猾的盗贼偷走了,现场只留下一些模糊不清的监控画面&a…...
【MCAL实战】MCU模块配置实践
目录 前言 正文 1.硬件分析 1.1 MCU系统模式分析 1.2MCU晶振使用分析 2.MCU通用配置 2.1 McuGeneralConfiguration 2.2 McuModuleConfiguration 2.3 McuResetSettingConf 2.4 McuTrapSettingConf 2.4 其他 3.MCU模式配置 3.1 McuModeSettingConf_0 3.2 McuModeSe…...
Vue3笔记——(三)hooks、路由
015 hooks 作用:使得代码更加模块化和可维护 Person.vue <template><div><h2>当前求和{{ sum }}</h2><button click"addFn">点我sum1</button></div> </template> <script setup lang"ts"…...
WinRAR.exe命令行的使用
工具 命令行打包命令 rem 默认压缩根目录,递归处理子文件夹使用 -r WinRAR.exe a -r test.rar C:/web/Views/...
【fly-iot飞凡物联】(20):2025年总体规划,把物联网整套技术方案和实现并落地,完成项目开发和课程录制。
前言 fly-iot飞凡物联专栏: https://blog.csdn.net/freewebsys/category_12219758.html 1,开源项目地址进行项目开发 https://gitee.com/fly-iot/fly-iot-platform 完成项目开发,接口开发。 把相关内容总结成文档,并录制课程。…...
Effective C++ 规则51:编写 new 和 delete 时需固守常规
1、背景 在 C 中,如果你需要为类自定义 new 和 delete,必须遵循一些约定和规则,以确保内存管理的一致性、可维护性和安全性。当我们使用 new 和 delete 操作时,C 编译器会: 调用全局或类特定的 operator new 来分配内…...
【更正版】梯级水光互补系统最大化可消纳电量期望短期优化调度模型
目录 1 主要内容 目标函数: 约束条件: 线性化处理: 流程示意: 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《梯级水光互补系统最大化可消纳电量期望短期优化调度模型》,构建了以最大化整体可…...
移动端VR处理器和传统显卡的不同
骁龙 XR 系列芯片 更多地依赖 AI 技术 来优化渲染过程,而传统的 GPU 渲染 则倾向于在低画质下运行以减少负载。这种设计是为了在有限的硬件资源下(如移动端 XR 设备)实现高性能和低功耗的平衡。以下是具体的分析: 1. AI 驱动的渲染…...
基于回归分析法的光伏发电系统最大功率计算simulink建模与仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于回归分析法的光伏发电系统最大功率计算simulink建模与仿真。选择回归法进行最大功率点的追踪,使用光强和温度作为影响因素,电压作为输出进行建模。…...
JVM深入学习(一)
目录 一.JVM概述 1.1 为什么要学jvm? 1.2 jvm的作用 1.3 jvm内部构造 二.JVM类加载 2.1类加载过程 2.2类加载器 2.3类加载器的分类 2.4双亲委派机制 三.运行时数据区 堆空间区域划分(堆) 为什么分区(代)?(…...
【精选】基于数据挖掘的招聘信息分析与市场需求预测系统 职位分析、求职者趋势分析 职位匹配、人才趋势、市场需求分析数据挖掘技术 职位需求分析、人才市场趋势预测
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
视觉语言模型 (VLMs):跨模态智能的探索
文章目录 一. VLMs 的重要性与挑战:连接视觉与语言的桥梁 🌉二. VLMs 的核心训练范式:四种主流策略 🗺️1. 对比训练 (Contrastive Training):拉近正例,推远负例 ⚖️2. 掩码方法 (Masking):重构…...
