Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
使用 Pandas 高效关联多文件数据并提取特定信息_创想鸟

使用 Pandas 高效关联多文件数据并提取特定信息

使用 Pandas 高效关联多文件数据并提取特定信息

本教程详细介绍了如何利用 Python 的 Pandas 库,高效地处理来自多个文本文件的关联数据。通过将文件内容加载到 DataFrame 中,并运用 merge 操作进行数据整合,实现 IP 地址、MAC 地址和端口信息的精确匹配与提取,最终生成结构化的输出结果,避免了传统文件处理的复杂性。

场景需求:多文件数据关联与信息提取

在日常的数据处理任务中,我们经常会遇到需要从多个关联文件中提取和整合信息的情况。例如,给定三个文件:

file1.txt 包含一系列待查询的 IP 地址。file2.txt 包含 IP 地址到 MAC 地址的映射关系。file3.txt 包含 MAC 地址到端口的映射关系。

我们的目标是,对于 file1.txt 中的每个 IP 地址,首先在 file2.txt 中找到对应的 MAC 地址,然后利用这个 MAC 地址在 file3.txt 中找到对应的端口,最终以 “IP 地址 MAC 地址 端口” 的格式输出所有匹配的结果。

传统的文件处理方法,如逐行读取、嵌套循环和字符串匹配,在处理这类关联数据时往往效率低下且代码复杂,尤其当文件较大时,性能问题会更加突出。

Pandas 解决方案概览

Python 的 Pandas 库提供了一套强大的数据结构(DataFrame)和数据分析工具,特别适用于处理表格型数据。利用 Pandas,我们可以将每个文件视为一个 DataFrame,然后通过类似于 SQL 的 merge(合并)操作,高效地将这些 DataFrame 关联起来,从而轻松实现数据的整合和查询。这种方法不仅代码简洁,而且在处理大量数据时具有显著的性能优势。

数据准备:加载文件至 DataFrame

首先,我们需要将每个文本文件的内容加载到 Pandas DataFrame 中。在实际应用中,通常使用 pd.read_csv() 或 pd.read_table() 等函数从文件中读取数据。对于本教程的示例,我们将直接通过 Python 字典创建 DataFrame,以确保代码的自包含性和可运行性。

假设我们的原始文件内容如下:

file1.txt (IP地址列表):

1.1.1.11.1.1.21.1.1.31.1.1.61.1.1.11

file2.txt (IP到MAC的映射):

Protocol  Address   Age (min)  Addr            Type   InterfaceInternet  1.1.1.1         5    6026.aa11.1111  A      Ethernet1/49Internet  1.1.1.2         -    0006.f2d2.2d2f  A      Vlan1Internet  1.1.1.3         -    6026.aa33.3333  A      Vlan1Internet  1.1.1.4         0    Incomplete      AInternet  1.1.1.5         0    Incomplete      AInternet  1.1.1.6         64   fa16.6edb.6666  A      Vlan1Internet  1.1.1.11        23   fa16.7e7d.7777  A      Vlan1

file3.txt (MAC到端口的映射):

Unicast Entries vlan     mac address     type        protocols               port---------+---------------+--------+---------------------+------------------------- 1        6026.aa11.1111   static  ip,ipx,assigned,other Switch 1        0006.f2d2.2d2f   dynamic ip,ipx,assigned,other Ethernet1/24 1        6026.aa33.3333   dynamic ip,ipx,assigned,other Ethernet1/12 1        fa16.6edb.6666   dynamic ip,ipx,assigned,other Ethernet1/8 1        fa16.7e7d.7777   dynamic ip,ipx,assigned,other Ethernet1/10

对应的 DataFrame 创建代码如下:

import pandas as pd# 假设 file1.txt 只有一列IP地址,无表头# 实际读取文件示例: df1 = pd.read_csv('file1.txt', header=None, names=['ipv4'])df1 = pd.DataFrame({"ipv4":{"0":"1.1.1.1","1":"1.1.1.2","2":"1.1.1.3","3":"1.1.1.6","4":"1.1.1.11"}})# 假设 file2.txt 有表头,并且是空格分隔# 实际读取文件示例: df2 = pd.read_csv('file2.txt', delim_whitespace=True)df2 = pd.DataFrame({  "Protocol":{ "0":"Internet", "1":"Internet", "2":"Internet", "3":"Internet", "4":"Internet", "5":"Internet", "6":"Internet" },  "Address":{ "0":"1.1.1.1", "1":"1.1.1.2", "2":"1.1.1.3", "3":"1.1.1.4", "4":"1.1.1.5", "5":"1.1.1.6", "6":"1.1.1.11" },  "Age (min)":{ "0":"5", "1":"-", "2":"-", "3":"0", "4":"0", "5":"64", "6":"23" },  "Addr":{ "0":"6026.aa11.1111", "1":"0006.f2d2.2d2f", "2":"6026.aa33.3333", "3":"Incomplete", "4":"Incomplete", "5":"fa16.6edb.6666", "6":"fa16.7e7d.7777" },  "Type":{ "0":"A", "1":"A", "2":"A", "3":"A", "4":"A", "5":"A", "6":"A" },  "Interface":{ "0":"Ethernet1/49", "1":"Vlan1", "2":"Vlan1", "3":None, "4":None, "5":"Vlan1", "6":"Vlan1" }})# 假设 file3.txt 有表头,并且是空格分隔# 实际读取文件示例: df3 = pd.read_csv('file3.txt', delim_whitespace=True, skiprows=[1]) # skiprows跳过分隔线df3 = pd.DataFrame({    "vlan":{"0":1,"1":1,"2":1,"3":1,"4":1},    "mac address":{"0":"6026.aa11.1111","1":"0006.f2d2.2d2f","2":"6026.aa33.3333","3":"fa16.6edb.6666","4":"fa16.7e7d.7777"},    "type":{"0":"static","1":"dynamic","2":"dynamic","3":"dynamic","4":"dynamic"},    "protocols":{"0":"ip,ipx,assigned,other","1":"ip,ipx,assigned,other","2":"ip,ipx,assigned,other","3":"ip,ipx,assigned,other","4":"ip,ipx,assigned,other"},    "port":{"0":"Switch","1":" Ethernet1/24","2":" Ethernet1/12","3":" Ethernet1/8","4":" Ethernet1/10"}})

核心操作:使用 merge 函数整合数据

Pandas 的 merge 函数是实现 DataFrame 之间关联的核心工具。它类似于 SQL 中的 JOIN 操作,可以根据一个或多个共同的列将两个 DataFrame 合并。

在本例中,我们需要进行两次合并:

第一次合并:将 df1(包含IP地址)与 df2(包含IP到MAC的映射)合并。df1 中的 ipv4 列与 df2 中的 Address 列是共同的关联键。我们使用 how=”inner” 来确保只有在两个 DataFrame 中都存在的 IP 地址才会被保留。第二次合并:将第一次合并的结果与 df3(包含MAC到端口的映射)合并。第一次合并结果中的 Addr 列(即MAC地址)与 df3 中的 mac address 列是共同的关联键。

合并操作如下:

# 第一次合并:根据IP地址关联 df1 和 df2# left_on="ipv4" 指 df1 的关联列,right_on="Address" 指 df2 的关联列merged_df_ip_mac = df1.merge(df2, how="inner", left_on="ipv4", right_on="Address")# 第二次合并:根据MAC地址关联第一次合并的结果和 df3# left_on="Addr" 指 merged_df_ip_mac 的关联列,right_on="mac address" 指 df3 的关联列maindf = merged_df_ip_mac.merge(df3, how="inner", left_on="Addr", right_on="mac address")

通过这两次 inner 合并,maindf 中将只包含那些在所有三个文件中都能找到对应关系的 IP、MAC 和端口信息。

结果输出:提取并格式化所需信息

合并完成后,maindf 包含了所有我们需要的关联数据。现在,我们只需要从 maindf 中选择我们关心的列 (ipv4, Addr, port),并按照指定格式输出。

# 提取所需的列result_df = maindf[["ipv4", "Addr", "port"]]# 按照指定格式打印结果print("期望输出:")for index, row in result_df.iterrows():    print(f"ip {row['ipv4']} addr {row['Addr']} port {row['port']}")

这将产生以下输出:

ip 1.1.1.1 addr 6026.aa11.1111 port Switchip 1.1.1.2 addr 0006.f2d2.2d2f port Ethernet1/24ip 1.1.1.3 addr 6026.aa33.3333 port Ethernet1/12ip 1.1.1.6 addr fa16.6edb.6666 port Ethernet1/8ip 1.1.1.11 addr fa16.7e7d.7777 port Ethernet1/10

完整示例代码

以下是整合了所有步骤的完整 Python 代码:

import pandas as pd# 1. 数据准备:加载文件至 DataFrame (此处为演示目的,直接创建DataFrame)# 实际文件读取示例:# df1 = pd.read_csv('file1.txt', header=None, names=['ipv4'])# df2 = pd.read_csv('file2.txt', delim_whitespace=True)# df3 = pd.read_csv('file3.txt', delim_whitespace=True, skiprows=[1]) # 假设需要跳过第二行分隔线df1 = pd.DataFrame({"ipv4":{"0":"1.1.1.1","1":"1.1.1.2","2":"1.1.1.3","3":"1.1.1.6","4":"1.1.1.11"}})df2 = pd.DataFrame({  "Protocol":{ "0":"Internet", "1":"Internet", "2":"Internet", "3":"Internet", "4":"Internet", "5":"Internet", "6":"Internet" },  "Address":{ "0":"1.1.1.1", "1":"1.1.1.2", "2":"1.1.1.3", "3":"1.1.1.4", "4":"1.1.1.5", "5":"1.1.1.6", "6":"1.1.1.11" },  "Age (min)":{ "0":"5", "1":"-", "2":"-", "3":"0", "4":"0", "5":"64", "6":"23" },  "Addr":{ "0":"6026.aa11.1111", "1":"0006.f2d2.2d2f", "2":"6026.aa33.3333", "3":"Incomplete", "4":"Incomplete", "5":"fa16.6edb.6666", "6":"fa16.7e7d.7777" },  "Type":{ "0":"A", "1":"A", "2":"A", "3":"A", "4":"A", "5":"A", "6":"A" },  "Interface":{ "0":"Ethernet1/49", "1":"Vlan1", "2":"Vlan1", "3":None, "4":None, "5":"Vlan1", "6":"Vlan1" }})df3 = pd.DataFrame({    "vlan":{"0":1,"1":1,"2":1,"3":1,"4":1},    "mac address":{"0":"6026.aa11.1111","1":"0006.f2d2.2d2f","2":"6026.aa33.3333","3":"fa16.6edb.6666","4":"fa16.7e7d.7777"},    "type":{"0":"static","1":"dynamic","2":"dynamic","3":"dynamic","4":"dynamic"},    "protocols":{"0":"ip,ipx,assigned,other","1":"ip,ipx,assigned,other","2":"ip,ipx,assigned,other","3":"ip,ipx,assigned,other","4":"ip,ipx,assigned,other"},    "port":{"0":"Switch","1":" Ethernet1/24","2":" Ethernet1/12","3":" Ethernet1/8","4":" Ethernet1/10"}})# 2. 核心操作:使用 merge 函数整合数据# 第一次合并:df1 (ipv4) -> df2 (Address, Addr)merged_df_ip_mac = df1.merge(df2, how="inner", left_on="ipv4", right_on="Address")# 第二次合并:merged_df_ip_mac (Addr) -> df3 (mac address, port)maindf = merged_df_ip_mac.merge(df3, how="inner", left_on="Addr", right_on="mac address")# 3. 结果输出:提取并格式化所需信息result_df = maindf[["ipv4", "Addr", "port"]]print("最终匹配结果:")for index, row in result_df.iterrows():    print(f"ip {row['ipv4']} addr {row['Addr']} port {row['port']}")

注意事项

文件读取参数:pd.read_csv() 是读取 CSV 文件的常用函数,但它也可以处理其他分隔符的文件。对于空格或不规则分隔符的文件,可以使用 sep=’s+’ 或 delim_whitespace=True。如果文件没有表头,需要设置 header=None,并可以通过 names 参数手动指定列名。如果文件

以上就是使用 Pandas 高效关联多文件数据并提取特定信息的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Pytesseract在特定IDE中无法找到Tesseract的解决方案
上一篇 2025年12月14日 12:46:50
Python中NumPy计算加速:如何利用多进程避免数据拷贝瓶颈
下一篇 2025年12月14日 12:47:03

相关推荐

  • safari浏览器怎么把标签页固定在最左边_safari浏览器标签页固定最左设置

    Safari可通过“固定标签”功能将常用网页保持在标签栏最左并随启动恢复;2. 手动拖动标签至最左可临时调整顺序但不永久保存;3. 结合书签栏添加常用网站并固定标签,可提升访问效率。 如果您希望在使用 Safari 浏览器时将常用网页始终保持在标签栏的最左侧位置,以便快速访问,可以通过以下方法实现标…

    2026年9月21日
    000
  • 如何用Animoto制作AI营销视频?快速生成商业AI视频的教程

    如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程

    Animoto通过模板与拖放功能,结合AI生成的文案和配音,帮助用户快速制作品牌统一、节奏合理、带明确CTA的高效营销视频,适用于多平台推广。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Animoto是一个非常适合快速制作AI营销视频的…

    2026年9月21日 用户投稿
    000
  • 使用本地HTML文件运行JavaScript脚本失败的原因及解决方案

    本文旨在帮助开发者理解在没有Web服务器的情况下,直接通过浏览器打开本地HTML文件时,JavaScript脚本可能无法正常运行的原因,并提供相应的解决方案。文章将深入探讨浏览器安全策略、相对路径问题以及如何正确引入和执行JavaScript脚本,确保你的HTML、CSS和JavaScript代码能…

    2026年9月21日
    000
  • mac怎么使用磁盘工具_mac磁盘工具使用教程

    使用磁盘工具可解决Mac外接存储问题。1. 打开磁盘工具,选择设备后点击“急救”扫描修复错误;2. 通过“抹掉”功能将设备格式化为APFS或Mac OS扩展以提升兼容性;3. 利用“分区”功能划分硬盘为多个宗卷,便于数据管理;4. 创建空白磁盘映像用于备份,或恢复.dmg文件至U盘制作启动盘。 如果…

    2026年9月21日
    100
  • VSCode怎么看效果_VSCode实时预览和调试代码运行效果教程

    VSCode通过实时预览扩展和内置调试器实现代码效果查看。使用Live Server可实时预览前端页面,保存即刷新;Markdown文件支持侧边预览。调试功能需配置launch.json,支持Node.js、Python、浏览器端JavaScript等,通过断点、变量监视、调用堆栈等深入分析代码执行…

    2026年9月21日
    000
  • 抖音青少年模式时间限制?青少年模式40分钟后多久介绍

    短视频平台在青少年群体中日益受到欢迎。作为国内领先的短视频平台,抖音为了保护青少年的身心健康,推出了青少年模式。本文将围绕青少年模式的时间限制展开探讨,分析其对青少年健康成长的意义,并思考如何打造一个绿色的网络环境。 一、抖音青少年模式时间限制的价值 1. 防止沉迷于短视频 通过设置使用时长限制,抖…

    2026年9月21日
    200
  • 使用正则表达式检测字符串中的除零操作

    本文详细介绍了如何使用正则表达式精确检测字符串中潜在的除零操作。针对表达式中可能存在的变量引用(如<>)、数字、多余空格以及禁止包含引号等复杂情况,文章提供了一个高效的正则表达式模式,并深入解析其构成原理。通过具体的Java代码示例,读者将学习如何将此模式应用于实际编程场景,从而有效识别…

    2026年9月21日
    000
  • MySQL常见错误码代表什么_如何快速定位问题?

    MySQL常见错误码代表什么_如何快速定位问题?MySQL常见错误码代表什么_如何快速定位问题?MySQL常见错误码代表什么_如何快速定位问题?MySQL常见错误码代表什么_如何快速定位问题?

    遇到mysql错误码应先明确错误类型再逐步排查。error 1045表示用户名、密码或访问权限问题,需检查拼写、ip限制和远程访问权限;error 2003表示连接失败,需依次检查服务器状态、mysql服务运行情况、防火墙设置及bind-address配置;error 1054表示sql语句中引用了…

    2026年9月21日 用户投稿
    100
  • AI钉钉1.0联动雅里数科 共探“酒旅+AI”的工作新范式

    在数字化浪潮席卷全球的当下,人工智能正以前所未有的速度重塑各行各业,酒旅产业也正在迎来由ai驱动的深刻变革。10月11日,阿里巴巴钉钉再度走进雅里数科集团,开启一场关于“酒旅行业ai原生工作方式”的深度对话。此次交流标志着双方合作迈入全新阶段,致力于共同探索ai原生工作范式,引领酒旅行业迈向智能化发…

    2026年9月21日
    100
  • 如何检测Linux网络接口DMA状态 硬件加速功能验证

    如何检测Linux网络接口DMA状态 硬件加速功能验证如何检测Linux网络接口DMA状态 硬件加速功能验证如何检测Linux网络接口DMA状态 硬件加速功能验证如何检测Linux网络接口DMA状态 硬件加速功能验证

    可通过以下方法检测linux系统中网络接口dma状态和硬件加速是否启用:1.使用 ethtool -i eth0 和 ethtool -k eth0 查看驱动信息及sg、tso、ufo、gso功能是否启用;2.通过 cat /proc/interrupts 和 cat /proc/slabinfo …

    2026年9月21日 用户投稿
    800
  • win11系统占用C盘空间过大怎么办_Win11清理C盘空间方法

    首先使用磁盘清理工具删除系统文件,包括旧更新和临时安装文件;接着启用存储感知功能自动定期清理临时文件与回收站;然后手动清除用户临时文件夹(%temp%)中的缓存数据;最后更改新应用和个人文件的默认保存位置至非C盘分区,以释放并节省C盘空间。 如果您发现Windows 11系统文件占用了C盘大量空间,…

    2026年9月21日
    100
  • 如何从被调用类中获取调用者文件的命名空间

    本文探讨了在PHP中,如何在不通过参数传递的情况下,从一个被调用的工具类中获取到调用该方法的文件的命名空间。通过结合使用`debug_backtrace()`回溯调用栈以定位调用者文件,并利用`token_get_all()`解析文件内容来提取命名空间声明,提供了一种实用的解决方案。文章详细介绍了实…

    2026年9月21日
    000
  • 构建Spring自定义Kafka配置的注解式解决方案

    本文探讨了在Spring Boot应用中通过自定义注解实现Kafka配置自动化时遇到的挑战,特别是由于Bean注册时机不当导致的依赖注入失败。我们将深入分析问题根源,并提供两种核心解决方案:利用META-INF/spring.factories实现标准化的自动配置发现,以及通过ImportBeanD…

    2026年9月21日
    1100
  • 悟空浏览器开发者工具的控制台怎么用_悟空浏览器Console控制台使用入门教程

    首先启用悟空浏览器开发者工具并进入Console标签,可查看错误、警告等日志信息,通过过滤功能定位问题;支持执行JavaScript代码实时调试,监控网络请求失败及全局异常,还可清空或保存日志以便分析。 如果您在使用悟空浏览器进行网页开发或调试时,发现页面元素未按预期工作或脚本报错,则可以借助开发者…

    2026年9月21日
    700
  • 蝴蝶号无人直播中的AI角色控制技巧与注意事项

    蝴蝶号无人直播中的AI角色控制技巧与注意事项蝴蝶号无人直播中的AI角色控制技巧与注意事项蝴蝶号无人直播中的AI角色控制技巧与注意事项蝴蝶号无人直播中的AI角色控制技巧与注意事项

    要让蝴蝶号ai角色在直播中更具真实感和互动性,关键在于注入“人味儿”,打破“机器感”。首先,声音要有温度,选择有情感起伏的音色,并根据不同语境调整语调、语速,适当加入语气词增强亲切感;其次,确保视觉形象与行为模式统一,动作、表情、眼神与语音内容自然同步,强化人设一致性;第三,建立多层次互动逻辑,ai…

    2026年9月21日 用户投稿
    400
  • VSCode整个项目怎么导出_VSCode项目打包与导出为压缩文件的完整教程

    答案:导出VSCode项目可通过手动压缩、终端命令、插件或Git克隆实现,推荐使用终端命令排除node_modules并选择zip格式以兼顾兼容性与效率。 将VSCode整个项目导出,实际上就是将项目文件夹打包成一个压缩文件,方便备份、分享或迁移。下面介绍几种常见的打包导出方法。 解决方案: 手动压…

    2026年9月21日
    000
  • MySQL如何实现数据的实时备份_有哪些高效工具和方法?

    mysql 实时备份主要依赖主从复制、二进制日志(binlog)配合增量备份,以及借助专业工具实现自动化监控与恢复。一、主从复制通过将主库数据变更同步到从库实现“准实时”备份,但存在延迟风险,建议开启 gtid 模式提升一致性;二、结合 binlog 与定时归档实现可回溯的增量备份,配合全量备份可恢…

    2026年9月21日
    000
  • 百度网盘官方网页登录 百度网盘网页版入口快捷

    百度网盘官方网页登录入口是https://pan.baidu.com,用户可直接访问该网址登录账号,主界面布局清晰,支持文件上传下载、智能检索、跨设备同步及在线预览等功能。 百度网盘官方网页登录入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来百度网盘网页版入口快捷方式,感兴趣的网友一起…

    2026年9月21日
    100
  • MAC系统磁盘空间不足怎么办_Mac磁盘空间清理与管理技巧

    Mac存储空间不足时,应先使用系统自带的存储管理工具分析并优化存储,通过“关于本机”进入“管理”界面,启用优化选项;接着手动删除不常用应用及其在Application Support和Caches中的残留文件;再进入资源库清理Caches和Logs中的缓存与日志;随后在“避免杂乱”中查找并删除大型无…

    2026年9月21日
    000
  • DALL-E的AI混合工具如何使用?生成创意图像的详细操作教程

    DALL-E的AI混合工具能将两张图片融合生成新图像,操作简单且支持权重调整与后期编辑,适用于创意激发与艺术探索。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ DALL-E的AI混合工具,简单来说,就是把两张图“缝合”在一起,让AI帮你生…

    2026年9月21日
    000

发表回复

登录后才能评论
关注微信