利用Pandas和NumPy高效构建坐标DataFrame

利用pandas和numpy高效构建坐标dataframe

本文详细介绍了两种从现有DataFrame和索引列表构建新坐标DataFrame的方法。首先通过迭代字典构建,然后利用Pandas的`from_dict`方法实现。接着,重点阐述了如何运用NumPy的向量化操作,以更简洁、高效的方式直接从原始数据中提取并重构所需的X、Y坐标对。文章旨在提供清晰的教程,帮助用户根据数据规模和性能需求选择最合适的实现策略。

在数据处理和分析中,我们经常需要根据一系列索引或映射关系,从一个大型数据结构中提取特定数据点,并将其组织成新的结构。本教程将以一个具体场景为例,演示如何从一个包含节点信息(如X、Y坐标)的Pandas DataFrame中,根据一个由索引对组成的列表,高效地构建一个新的坐标DataFrame。最终目标是为路径规划或可视化准备数据。

场景描述

假设我们有一个名为 df 的DataFrame,它存储了多个节点的详细信息,包括 X 和 Y 坐标:

    Node       X      Y  Demand  Profit1      2  5.7735   0.00    40.0    16.02      3  2.8867   5.00    40.0    16.03      4 -2.8868   5.00    40.0    16.0... (其他节点数据)

同时,我们还有一个名为 tours 的列表,其中包含了一系列子列表,每个子列表是一个长度为2的整数对,例如 [0, 4]。这个整数对的第一个元素代表在 df 的 X 列中要查找的行索引(基于位置 iloc),第二个元素代表在 df 的 Y 列中要查找的行索引。需要注意的是,这两个索引可能指向 df 中的不同行。

我们的任务是创建一个新的DataFrame coord,它只有 X 和 Y 两列,每一行对应 tours 中的一个索引对所确定的 X, Y 坐标。

方法一:迭代构建与字典转换

这种方法通过遍历 tours 列表,逐一提取对应的 X 和 Y 值,然后将它们存储在一个字典中,最后将字典转换为DataFrame。

1. 初始化数据

首先,我们定义示例数据:

import pandas as pdimport numpy as nptours = [[0, 4], [0, 5], [0, 6], [1, 13], [2, 0], [3, 8], [4, 9], [5, 10],         [6, 7], [7, 1], [8, 2], [9, 3], [10, 11], [11, 14], [12, 0], [13, 12], [14, 0]]# 原始DataFrame,这里为了演示,使用简化版,实际数据可能更多data = {    'Node': [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],    'X': [5.7735, 2.8867, -2.8868, -5.7735, -2.8867, 2.8868, 8.6603, 0.0000, -8.6603, -8.6603, 0.0000, 8.6603, 5.3405, 3.3198, 6.4952],    'Y': [0.00, 5.00, 5.00, 0.00, -5.00, -5.00, 5.00, 10.00, 5.00, -5.00, -10.00, -5.00, 0.75, 4.25, -1.25],    'Demand': [40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 10.0, 10.0, 10.0],    'Profit': [16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 24.0, 24.0, 24.0, 24.0, 10.0, 10.0, 11.0]}df = pd.DataFrame(data, index=range(len(data['Node']))) # 确保索引从0开始,方便iloc使用print("原始DataFrame df:")print(df)

2. 迭代与字典填充

通过 for 循环遍历 tours 列表,使用 enumerate 获取当前迭代的索引 t,这可以作为新字典的键。对于每个 tour 元素,tour[0] 用于查找 df 的 X 列中的值,tour[1] 用于查找 df 的 Y 列中的值。这里使用 .iloc[] 进行基于位置的索引。

# 方法一:迭代构建与字典转换d = {}for t, tour in enumerate(tours):    xi = tour[0] # X坐标在df中的行索引    yi = tour[1] # Y坐标在df中的行索引    # 从df中根据iloc索引提取X和Y值    x_val = df["X"].iloc[xi]    y_val = df["Y"].iloc[yi]    d[t] = (x_val, y_val)print("n构建的字典 d:")print(d)

3. 字典转换为DataFrame

构建好字典 d 后,可以使用 pd.DataFrame.from_dict() 方法将其转换为DataFrame。关键在于设置 orient=’index’,这表示字典的键将成为DataFrame的索引,而值(这里是元组 (x_val, y_val))将作为行数据。同时,通过 columns=[‘X’, ‘Y’] 参数明确指定新DataFrame的列名。

coord_iterative = pd.DataFrame.from_dict(d, orient='index', columns=['X', 'Y'])print("n方法一生成的coord DataFrame:")print(coord_iterative)

这种方法直观易懂,代码逻辑清晰,适用于理解每一步操作的场景,尤其是在数据量不大时。

方法二:NumPy 向量化操作

对于大规模数据,使用NumPy的向量化操作通常能提供显著的性能提升和更简洁的代码。这种方法避免了显式的Python循环。

1. 准备NumPy数组

首先,将 tours 列表转换为NumPy数组,以便进行高效的切片和索引操作。同时,将 df 中需要提取的 X 和 Y 列也转换为NumPy数组,这可以减少Pandas Series的开销。

# 方法二:NumPy 向量化操作tours_np = np.array(tours)# 提取df中X和Y列的数据为NumPy数组# 注意:df的索引需要与tours中的索引匹配,这里df的索引是0-baseddf_xy_values = df[["X", "Y"]].to_numpy()print("ntours_np 数组:")print(tours_np)print("ndf_xy_values 数组 (X和Y列):")print(df_xy_values)

2. 向量化索引与DataFrame构建

NumPy允许使用数组作为索引。tours_np[:, 0] 提取了 tours 中所有子列表的第一个元素(即用于查找X的索引),tours_np[:, 1] 提取了所有子列表的第二个元素(即用于查找Y的索引)。

df_xy_values[tours_np[:, 0], 0]:tours_np[:, 0] 得到一个一维数组,包含了所有X坐标的行索引。df_xy_values[…] 使用这些行索引从 df_xy_values 中选择行。, 0 表示从这些选定的行中,进一步选择第0列(即原始的 X 值)。df_xy_values[tours_np[:, 1], 1]:tours_np[:, 1] 得到一个一维数组,包含了所有Y坐标的行索引。df_xy_values[…] 使用这些行索引从 df_xy_values 中选择行。, 1 表示从这些选定的行中,进一步选择第1列(即原始的 Y 值)。

最后,将这两个结果数组直接传入 pd.DataFrame 构造函数,并指定列名。

# 使用NumPy的高级索引直接提取X和Y值# tours_np[:, 0] 获取所有X的索引# tours_np[:, 1] 获取所有Y的索引# df_xy_values[行索引, 列索引]x_coords = df_xy_values[tours_np[:, 0], 0]y_coords = df_xy_values[tours_np[:, 1], 1]coord_vectorized = pd.DataFrame({"X": x_coords, "Y": y_coords})print("n方法二生成的coord DataFrame (NumPy 向量化):")print(coord_vectorized)

这种方法极其高效,尤其是在处理大量数据时,因为它充分利用了NumPy底层C语言实现的优化。代码也更为紧凑。

对比与选择

迭代构建与字典转换:优点:逻辑清晰,易于理解和调试。缺点:对于非常大的数据集,Python的循环开销可能导致性能瓶颈。NumPy 向量化操作:优点:性能卓越,代码简洁,是处理大型数值数据集的首选方法。缺点:对于初学者来说,NumPy的高级索引可能需要一些时间来理解。

在实际应用中,如果数据量不大,两种方法都可以接受。但如果追求极致性能或处理GB级别的数据,强烈推荐使用NumPy向量化方法。

注意事项

索引类型:本教程中,df.iloc[] 和 NumPy 索引都依赖于基于位置的整数索引。请确保 tours 中的索引值与 df 的实际行位置匹配。如果 df 有自定义索引且您希望按标签查找,则需要使用 df.loc[] 并可能需要一个从标签到位置的映射。数据类型:确保从 df 中提取的 X 和 Y 列是数值类型,以便后续的计算或绘图。内存效率:NumPy向量化方法在某些情况下可能需要一次性分配较大的内存来存储中间结果,但通常其速度优势会弥补这一点。

总结

本教程展示了两种在Pandas和NumPy中,根据索引列表从现有DataFrame中提取并构建新坐标DataFrame的有效方法。迭代构建方法提供直观的实现,而NumPy向量化方法则提供了卓越的性能和代码简洁性。理解并掌握这两种技术,将有助于您更灵活、高效地处理数据,为后续的数据可视化(如绘制路径)奠定坚实的基础。根据您的具体需求和数据规模,选择最适合的方法,可以显著提高开发效率和程序性能。

以上就是利用Pandas和NumPy高效构建坐标DataFrame的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1379227.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
使用Selenium自动化处理动态下拉菜单与数据提取教程
上一篇 2025年12月14日 20:28:33
解决PyQt6 Qt_6.6 版本未找到错误:官方安装器的实践指南
下一篇 2025年12月14日 20:28:46

相关推荐

  • 如何解决电商网站复杂搜索与筛选难题?SprykerSearchFeature与Composer助你轻松构建高效用户体验

    如何解决电商网站复杂搜索与筛选难题?SprykerSearchFeature与Composer助你轻松构建高效用户体验如何解决电商网站复杂搜索与筛选难题?SprykerSearchFeature与Composer助你轻松构建高效用户体验如何解决电商网站复杂搜索与筛选难题?SprykerSearchFeature与Composer助你轻松构建高效用户体验如何解决电商网站复杂搜索与筛选难题?SprykerSearchFeature与Composer助你轻松构建高效用户体验

    可以通过一下地址学习composer:学习地址 在当今的电商世界里,用户体验至上。而用户体验的核心,往往就体现在他们能否快速、准确地找到所需商品。想象一下,你正在搭建一个功能丰富的电商网站,用户期待的不仅仅是简单的关键词搜索,他们还需要多语言支持、全站搜索、按品类筛选、动态过滤,甚至复杂的“分面搜索…

    2026年10月7日 • 用户投稿
    100
  • 如何解决大型文件上传中断与超时问题,使用flowjs/flow-php-server轻松实现断点续传

    如何解决大型文件上传中断与超时问题,使用flowjs/flow-php-server轻松实现断点续传如何解决大型文件上传中断与超时问题,使用flowjs/flow-php-server轻松实现断点续传如何解决大型文件上传中断与超时问题,使用flowjs/flow-php-server轻松实现断点续传如何解决大型文件上传中断与超时问题,使用flowjs/flow-php-server轻松实现断点续传

    可以通过一下地址学习composer:学习地址 1. 实际问题切入:大型文件上传的噩梦 想象一下这样的场景:你的用户正在兴致勃勃地上传一个几百兆甚至上G的视频文件到你的平台。文件上传到一半,突然网络断了,或者用户不小心关闭了浏览器,又或者是服务器因为上传时间过长而直接报了504 Gateway Ti…

    2026年10月6日 • 用户投稿
    100
  • Java调用Python脚本的几种实现方式对比

    Java调用Python脚本的几种实现方式对比Java调用Python脚本的几种实现方式对比Java调用Python脚本的几种实现方式对比Java调用Python脚本的几种实现方式对比

    java调用python脚本有三种主要方式:进程调用、jython嵌入和rpc/消息队列;2. 进程调用通过runtime.exec或processbuilder启动独立python进程,适用于简单脚本但性能开销大;3. jython嵌入将python代码编译为java字节码,实现无缝集成但不支持c…

    2026年10月6日 • 用户投稿
    100
  • PostgreSQL时间戳时区偏移量超出范围错误解析与修正

    PostgreSQL时间戳时区偏移量超出范围错误解析与修正PostgreSQL时间戳时区偏移量超出范围错误解析与修正PostgreSQL时间戳时区偏移量超出范围错误解析与修正PostgreSQL时间戳时区偏移量超出范围错误解析与修正

    本文深入解析了PostgreSQL中“time zone displacement out of range”错误,该错误通常发生在使用timestamp with time zone类型时,由于对时间戳字符串中时区偏移部分的误解导致。文章详细阐述了+HH或+HHMM表示的是时区偏移而非毫秒,并指出…

    2026年10月6日 • 用户投稿
    200
  • 解决PostgreSQL时间戳时区偏移超出范围错误

    解决PostgreSQL时间戳时区偏移超出范围错误解决PostgreSQL时间戳时区偏移超出范围错误解决PostgreSQL时间戳时区偏移超出范围错误解决PostgreSQL时间戳时区偏移超出范围错误

    本文旨在解决PostgreSQL数据库中time zone displacement out of range错误,该错误通常源于时间戳字符串中时区偏移部分的误解和不当格式化。我们将深入分析错误产生的原因,特别是结合Python代码生成时间戳字符串时的常见陷阱,并提供正确的处理策略和最佳实践,确保时…

    2026年10月6日 • 用户投稿
    300
  • VSCode如何实现代码行为分析 VSCode运行时特性可视化工具

    VSCode如何实现代码行为分析 VSCode运行时特性可视化工具VSCode如何实现代码行为分析 VSCode运行时特性可视化工具VSCode如何实现代码行为分析 VSCode运行时特性可视化工具VSCode如何实现代码行为分析 VSCode运行时特性可视化工具

    高效调试与性能瓶颈定位需结合断点调试、条件断点、日志断点及内置调试器功能,通过launch.json配置调试环境,利用cpu性能分析和堆快照定位问题;2. 可视化运行时数据依赖第三方扩展,如调试器增强类、性能分析查看器、内存/cpu监控、日志可视化工具和调用图生成器,按语言和项目选择合适扩展;3. …

    2026年10月6日 • 用户投稿
    100
  • .NET Core 3.0 中的新变化

    .NET Core 3.0 中的新变化.NET Core 3.0 中的新变化.NET Core 3.0 中的新变化.NET Core 3.0 中的新变化

    .net core 3.0 标志着 .net core 平台的一个重要新版本。本文回顾了 .net core 的发展历程,并展示了它如何从最初仅支持 web 和数据工作负载的版本 1,发展到能够支持 web、桌面、机器学习、容器、物联网等的版本 3.0。 .NET Core 1.NET Core 的…

    2026年10月6日 • 用户投稿
    100
  • Java游戏开发 Java 2D游戏引擎入门教程

    Java游戏开发 Java 2D游戏引擎入门教程Java游戏开发 Java 2D游戏引擎入门教程Java游戏开发 Java 2D游戏引擎入门教程Java游戏开发 Java 2D游戏引擎入门教程

    在java中开发2d游戏的核心在于理解游戏循环、绘图、输入处理和碰撞检测等基本要素,并通过awt/swing从零构建框架以深入理解本质。解决方案分五步:1. 游戏循环使用独立线程持续更新游戏状态并重绘屏幕;2. 用jpanel的paintcomponent方法结合graphics2d进行绘图;3. …

    2026年10月6日 • 用户投稿
    100
  • 使用 Firestore Query Protos 自动生成多语言查询方法

    使用 Firestore Query Protos 自动生成多语言查询方法使用 Firestore Query Protos 自动生成多语言查询方法使用 Firestore Query Protos 自动生成多语言查询方法使用 Firestore Query Protos 自动生成多语言查询方法

    本文旨在帮助开发者将 Firestore 查询从一种编程语言转换为另一种,尤其是当需要在多种语言之间共享查询逻辑时。核心思想是将 Firestore 查询转换为 Protobuf 格式,然后利用字符串格式化技术,根据 Protobuf 字符串生成目标语言的查询代码。 1. 将 Firestore 查…

    2026年10月6日 • 用户投稿
    200
  • 从 Firestore Query Protos 自动生成多语言查询方法

    从 Firestore Query Protos 自动生成多语言查询方法从 Firestore Query Protos 自动生成多语言查询方法从 Firestore Query Protos 自动生成多语言查询方法从 Firestore Query Protos 自动生成多语言查询方法

    本文将介绍一种利用 firestore 的 structuredquery 类,结合字符串格式化技术,实现从 java firestore 查询自动生成其他编程语言查询代码的方法。这种方法允许开发者在不同编程语言之间复用 firestore 查询逻辑,从而简化多语言应用的开发。 在 Java 中,可…

    2026年10月6日 • 用户投稿
    100
  • 专属Python开发者的完美终端工具

    专属Python开发者的完美终端工具专属Python开发者的完美终端工具专属Python开发者的完美终端工具专属Python开发者的完美终端工具

    大家好,我是小编。 今天我为大家推荐一款非常精致的终端工具 – Rich。 Rich 是一个 Python 库,可以在终端中为您提供富文本和美观、精致的格式。 通过 Rich API,您可以轻松地在终端输出中添加各种颜色和不同的样式。它能绘制精美的表格、进度条、Markdown、语法高亮…

    2026年10月6日 • 用户投稿
    700
  • Cursor永久免费攻略:无限邮箱注册+重置机器码+Cursor试用期重置工具实现永久免费使用

    Cursor永久免费攻略:无限邮箱注册+重置机器码+Cursor试用期重置工具实现永久免费使用Cursor永久免费攻略:无限邮箱注册+重置机器码+Cursor试用期重置工具实现永久免费使用Cursor永久免费攻略:无限邮箱注册+重置机器码+Cursor试用期重置工具实现永久免费使用Cursor永久免费攻略:无限邮箱注册+重置机器码+Cursor试用期重置工具实现永久免费使用

    全新攻略:cursor pro 无限续杯技巧,全自动化工具,兼容cursor 0.46 此前苏米分享过几篇关于Cursor的教程文章,如今眼看Cursor的免费额度即将耗尽,升级至PRO需花费20美元/月,这对初学者而言成本偏高,那么普通用户该如何持续使用呢?苏米整理了目前较为可靠的四种方案,供正在…

    2026年10月5日 • 用户投稿
    200
  • win11怎么卸载edge浏览器_Win11彻底卸载Microsoft Edge浏览器指南

    win11怎么卸载edge浏览器_Win11彻底卸载Microsoft Edge浏览器指南win11怎么卸载edge浏览器_Win11彻底卸载Microsoft Edge浏览器指南win11怎么卸载edge浏览器_Win11彻底卸载Microsoft Edge浏览器指南win11怎么卸载edge浏览器_Win11彻底卸载Microsoft Edge浏览器指南

    通过PowerShell可彻底卸载Windows 11自带Edge浏览器,依次使用管理员权限终端定位安装路径、执行强制卸载命令,再结合第三方工具清理残留文件与注册表项,或修改注册表启用原生卸载功能,亦可借助专用脚本自动化移除。 如果您尝试移除Windows 11系统自带的Microsoft Edge…

    2026年10月5日 • 用户投稿
    200
  • win10怎么解决搜索框无法输入_win10任务栏搜索框失灵修复方法

    win10怎么解决搜索框无法输入_win10任务栏搜索框失灵修复方法win10怎么解决搜索框无法输入_win10任务栏搜索框失灵修复方法win10怎么解决搜索框无法输入_win10任务栏搜索框失灵修复方法win10怎么解决搜索框无法输入_win10任务栏搜索框失灵修复方法

    首先重启Windows资源管理器和搜索服务,其次通过PowerShell重新注册Cortana组件,然后重建Windows搜索索引数据库,最后修改注册表删除异常键值以恢复任务栏搜索功能。 如果您尝试在Windows 10的任务栏搜索框中输入内容,但发现无法打字或点击无反应,这可能是由于系统服务异常、…

    2026年10月5日 • 用户投稿
    200
  • VSCode如何通过AI生成技术文档 VSCode自动创建项目文档的AI工具

    安装并登录github copilot扩展,确保服务已激活;2. 利用copilot在函数、类、模块上方输入文档注释符号,ai将根据上下文自动生成函数作用、参数说明、返回值等内容;3. 在readme或配置文件中输入内容时,copilot会基于项目结构和文件信息提供建议;4. 将ai生成内容视为初稿…

    2026年10月5日
    200
  • 如何解决DoctrineDBAL日志记录的困境?firehed/dbal-logger助你重获自由与掌控!

    如何解决DoctrineDBAL日志记录的困境?firehed/dbal-logger助你重获自由与掌控!如何解决DoctrineDBAL日志记录的困境?firehed/dbal-logger助你重获自由与掌控!如何解决DoctrineDBAL日志记录的困境?firehed/dbal-logger助你重获自由与掌控!如何解决DoctrineDBAL日志记录的困境?firehed/dbal-logger助你重获自由与掌控!

    可以通过一下地址学习composer:学习地址 在PHP项目中,尤其是那些依赖Doctrine DBAL进行数据库操作的应用,我们常常需要对SQL查询进行日志记录。这不仅是为了调试,更是为了性能分析、审计追踪和系统健康监控。想象一下,当你的应用出现数据库相关的性能瓶颈时,如果没有详细的查询日志,排查…

    2026年10月5日 • 用户投稿
    100
  • Java printf格式化输出:掌握字符串与变量的混合使用

    Java printf格式化输出:掌握字符串与变量的混合使用Java printf格式化输出:掌握字符串与变量的混合使用Java printf格式化输出:掌握字符串与变量的混合使用Java printf格式化输出:掌握字符串与变量的混合使用

    本文详细介绍了在Java printf语句中正确添加字符串的方法。针对用户在格式化输出中混合数字和文本时遇到的常见问题,文章阐述了两种有效的解决方案:一是利用%s格式说明符将字符串作为参数传入,适用于动态文本;二是直接将固定字符串嵌入到格式化字符串内部,适用于静态文本。通过具体示例,帮助读者避免常见…

    2026年10月5日 • 用户投稿
    200
  • 飞利浦商用显示器打造深度定制显示解决方案,助力智造升级!

    飞利浦商用显示器打造深度定制显示解决方案,助力智造升级!飞利浦商用显示器打造深度定制显示解决方案,助力智造升级!飞利浦商用显示器打造深度定制显示解决方案,助力智造升级!飞利浦商用显示器打造深度定制显示解决方案,助力智造升级!

    工业4.0时代背景下,作为工业物联网数字化呈现的重要工具,显示终端必然需要具备专业、环保、稳定、高效等特质。基于此,飞利浦商用显示器立足于生产制造过程中的实际显示需求,推出多系列专业显示产品,以创新科技为制造行业可视化赋能,助力企业高效实现智能制造升级! 24B2N2100L商用显示器 专业显示,还…

    2026年10月5日 • 用户投稿
    000
  • PyCharm字体设置指南

    PyCharm字体设置指南PyCharm字体设置指南PyCharm字体设置指南PyCharm字体设置指南

    设置pycharm字体需打开编辑器设置,挑选合适的字体样式与大小,同时关注显示效果与兼容性问题。 1、 PyCharm社区版在大多数开发场景下功能完备,与专业版相比日常编码基本无差别。 2、 点击顶部菜单栏的“文件”,进入“设置”界面,随后选择“编辑器”进行相关配置。 3、 在右侧区域找到并点击“字…

    2026年10月5日 • 用户投稿
    1100
  • Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言

    Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言

    java 调用 python 脚本最常见方式是通过 processbuilder 执行外部命令,1. 可调用系统命令并传递参数,2. 支持设置环境变量与工作目录,3. 可捕获输出与错误信息,4. 需读取输入输出流避免阻塞,5. 通过 exitcode 判断执行结果,适用于 python 作为独立模块…

    2026年10月5日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信