Pandas基础02(DataFrame创建/索引/切片/属性/方法/层次化索引)

news2025/1/29 6:25:26

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的运算
  1. 在运算中自动对齐索引
  2. 如果索引不对应,则补NaN
  3. 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

image-20250124204543442

Series:

data = np.random.randint(0, 100, (4, ))
index = [
    ["2214班","2214班","2215班","2215班"],
    ["zhangsan", "lisi", "wangwu", "zhaoliu"]
]
s = pd.Series(data=data, index=index)
s

2214班  zhangsan    85
       lisi        98
2215班  wangwu      24
       zhaoliu     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())
image-20250125171936694
  • unstack():将行转为列
df.unstack() #默认将行的最后一个索引转换为列的最后一个索引,由于2214班无wangwu等人所以会NaN填写空缺

image-20250125172109302

3.1.4 索引的聚合

image-20250124204543442

# 每一行相加: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()

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

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

相关文章

Meta-CoT:通过元链式思考增强大型语言模型的推理能力

大型语言模型(LLMs)在处理复杂推理任务时面临挑战,这突显了其在模拟人类认知中的不足。尽管 LLMs 擅长生成连贯文本和解决简单问题,但在需要逻辑推理、迭代方法和结果验证的复杂任务(如高级数学问题和抽象问题解决&…

【时时三省】(C语言基础)二进制输入输出

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 二进制输入 用fread可以读取fwrite输入的内容 字符串以文本的形式写进去的时候,和以二进制写进去的内容是一样的 整数和浮点型以二进制写进去是不一样的 二进制输出 fwrite 字…

【go语言】数组和切片

一、数组 1.1 什么是数组 数组是一组数:数组需要是相同类型的数据的集合;数组是需要定义大小的;数组一旦定义了大小是不可以改变的。 1.2 数组的声明 数组和其他变量定义没有什么区别,唯一的就是这个是一组数,需要给…

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文件&…

基于微信小程序的网上订餐管理系统

作者:计算机学姐 开发技术: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 {…

【数据结构】深入解析:构建父子节点树形数据结构并返回前端

树形数据结构列表 一、前言二、测试数据生成三、树形代码3.1、获取根节点3.2、遍历根节点,递归获取所有子节点3.3、排序3.4、完整代码 一、前言 返回前端VO对象中,有列情况列表展示需要带树形结构,例如基于RBAC权限模型中的菜单返回&#xf…

JAVA 使用反射比较对象属性的变化,记录修改日志。使用注解【策略模式】,来进行不同属性枚举值到中英文描述的切换,支持前端国际化。

1.首先定义一个接口,接口中有两个方法,分别是将属性转换成英文描述和中文描述。 其实就是将数据库中记录的 0 1 ,转换成后面的描述 这边定义了中文转换为默认方法,是因为有些属性不需要进行中文转换,或者该属性的枚举…

基于模糊PID的孵化箱温度控制系统(论文+源码)

1系统方案设计 本课题为基于模糊PID的孵化箱温度控制系统,其以STM32最小系统与模糊PID控制器为控制核心。系统主要包括数据采集模块、处理器模块、电机控制模块。 数据采集模块由温度传感器构成,通过温度传感器感应温度变化,获得待处理的数据…

机器学习-数据集划分

文章目录 一. 为什么要划分数据集二. 数据集划分的方法1. 留出法:2. 交叉验证:将数据集划分为训练集,验证集,测试集3. 留一法:4. 自助法: 一. 为什么要划分数据集 为了能够评估模型的泛化能力,可…

Hive之加载csv格式数据到hive

场景: 今天接了一个需求,将测试环境的hive数据导入到正式环境中。但是不需要整个流程的迁移,只需要迁移ads表 解决方案: 拿到这个需求首先想到两个方案: 1、将数据通过insert into语句导出,然后运行脚本 …

C# OpenCV机器视觉:利用CNN实现快速模板匹配

在一个阳光灿烂的周末,阿强正瘫在沙发上,百无聊赖地换着电视频道。突然,一则新闻吸引了他的注意:某博物馆里一幅珍贵的古画离奇失踪,警方怀疑是被一伙狡猾的盗贼偷走了,现场只留下一些模糊不清的监控画面&a…

WinRAR.exe命令行的使用

工具 命令行打包命令 rem 默认压缩根目录,递归处理子文件夹使用 -r WinRAR.exe a -r test.rar C:/web/Views/

【更正版】梯级水光互补系统最大化可消纳电量期望短期优化调度模型

目录 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双亲委派机制 三.运行时数据区 堆空间区域划分(堆) 为什么分区(代)?&#xff08…

【精选】基于数据挖掘的招聘信息分析与市场需求预测系统 职位分析、求职者趋势分析 职位匹配、人才趋势、市场需求分析数据挖掘技术 职位需求分析、人才市场趋势预测

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

视觉语言模型 (VLMs):跨模态智能的探索

文章目录 一. VLMs 的重要性与挑战:连接视觉与语言的桥梁 🌉二. VLMs 的核心训练范式:四种主流策略 🗺️1. 对比训练 (Contrastive Training):拉近正例,推远负例 ⚖️2. 掩码方法 (Masking):重构…