目錄
場景描述與挑戰
Pandas解決方案概覽
數據準備:從文件加載到DataFrame
核心操作:DataFrame合併(Merge)
結果提取與展示
完整代碼示例
注意事項與最佳實踐
總結
首頁 後端開發 Python教學 使用Pandas高效整合多文件數據:IP、MAC與端口關聯教程

使用Pandas高效整合多文件數據:IP、MAC與端口關聯教程

Sep 21, 2025 pm 03:00 PM

使用Pandas高效整合多文件數據:IP、MAC與端口關聯教程

本教程詳細演示瞭如何利用Python的Pandas庫高效地從多個文本文件中提取、關聯並整合特定數據。通過將文件數據加載為DataFrame,並使用merge操作進行基於IP地址和MAC地址的內連接,最終實現從不同來源的文件中精確匹配並輸出IP、MAC地址及對應端口的關聯信息。

場景描述與挑戰

在日常的數據處理任務中,我們經常會遇到需要從多個分散的文本文件中提取信息,並根據某些共同的標識符將它們關聯起來的場景。例如,你可能有一個包含IP地址列表的文件,一個記錄IP地址與MAC地址映射關係的文件,以及一個包含MAC地址與交換機端口對應關係的文件。我們的目標是,給定一個IP地址列表,找出每個IP對應的MAC地址,進而找到該MAC地址所連接的交換機端口,並最終輸出IP、MAC地址和端口的對應關係。

手動通過文件迭代和字符串匹配來完成這項任務不僅效率低下,而且代碼複雜、易出錯。當文件規模增大時,這種方法幾乎不可行。幸運的是,Python的Pandas庫提供了強大的數據結構(DataFrame)和數據操作工具,可以極大地簡化此類任務。

Pandas解決方案概覽

Pandas庫的核心是DataFrame,它是一個二維的、表格型的數據結構,類似於電子表格或SQL數據庫中的表。 Pandas提供了豐富的函數來讀取各種數據源、進行數據清洗、轉換、合併以及分析。對於多文件數據關聯問題,我們可以將每個文件加載為DataFrame,然後使用merge方法像SQL的JOIN操作一樣將它們連接起來。

數據準備:從文件加載到DataFrame

首先,我們需要將提供的三個文本文件(file1.txt, file2.txt, file3.txt)加載到Pandas DataFrame中。 pd.read_csv是加載文本文件的主要函數,通過調整其參數可以適應各種文件格式。

假設我們的文件內容如下:

file1.txt

 1.1.1.1
1.1.1.2
1.1.1.3
1.1.1.6
1.1.1.11

file2.txt

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

file3.txt

 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

現在,我們來加載這些文件:

 import pandas as pd
import io # 用於模擬文件讀取,實際應用中直接使用文件名# 模擬文件內容,實際應用中會直接使用pd.read_csv('file_name.txt', ...)
file1_content = """1.1.1.1
1.1.1.2
1.1.1.3
1.1.1.6
1.1.1.11"""

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

file3_content = """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"""

# 1. 加載file1.txt: 只有一列IP地址,無表頭df1 = pd.read_csv(io.StringIO(file1_content), header=None, names=['ipv4'])
print("df1:")
print(df1.head())
print("-" * 30)

# 2. 加載file2.txt: 多列,以空格分隔,有表頭# 使用sep=r'\s ' 匹配一個或多個空格作為分隔符,engine='python' 支持正則表達式分隔符df2 = pd.read_csv(io.StringIO(file2_content), sep=r'\s ', engine='python')
print("df2:")
print(df2.head())
print("-" * 30)

# 3. 加載file3.txt: 多列,以空格分隔,有表頭,但第二行是分隔線需要跳過# skiprows=[1] 跳過索引為1的行(即第二行)
df3 = pd.read_csv(io.StringIO(file3_content), sep=r'\s ', engine='python', skiprows=[1])
print("df3:")
print(df3.head())
print("-" * 30)

說明:

  • io.StringIO() 用於將字符串內容模擬成文件對象,方便演示。實際應用中,直接將io.StringIO(...)替換為文件路徑,如'file1.txt'。
  • header=None:表示文件沒有表頭,Pandas會默認生成數字列名。
  • names=['ipv4']:為沒有表頭的文件指定列名。
  • sep=r'\s ':使用正則表達式匹配一個或多個空格作為分隔符,適用於列之間有不規則空格的情況。
  • engine='python':當sep參數使用正則表達式時,需要指定engine='python'。
  • skiprows=[1]:跳過文件的第二行(索引為1的行),因為它是分隔符。

核心操作:DataFrame合併(Merge)

現在我們有了三個DataFrame,接下來就是將它們關聯起來。 Pandas的merge方法類似於SQL中的JOIN操作,可以根據一個或多個鍵(列)將兩個DataFrame連接起來。

我們將執行兩次inner合併:

  1. 第一次合併:將df1(IP列表)與df2(IP-MAC映射)合併,以df1的ipv4列和df2的Address列作為連接鍵。這將篩選出file1中存在的IP,並獲取它們在file2中對應的MAC地址(Addr列)。
  2. 第二次合併:將第一次合併的結果與df3(MAC-端口映射)合併,以第一次合併結果的Addr列和df3的mac address列作為連接鍵。這將獲取對應的端口信息。
 # 第一次合併:df1 (ipv4) 與df2 (Address)
# left_on='ipv4' 指明df1 的連接鍵是'ipv4' 列# right_on='Address' 指明df2 的連接鍵是'Address' 列# how='inner' 表示只保留兩個DataFrame中都存在的匹配項merged_df_ip_mac = df1.merge(df2, how="inner", left_on="ipv4", right_on="Address")
print("第一次合併結果(IP-MAC):")
print(merged_df_ip_mac.head())
print("-" * 30)

# 第二次合併:第一次合併的結果(Addr) 與df3 (mac address)
# left_on='Addr' 指明merged_df_ip_mac 的連接鍵是'Addr' 列# right_on='mac address' 指明df3 的連接鍵是'mac address' 列final_merged_df = merged_df_ip_mac.merge(df3, how="inner", left_on="Addr", right_on="mac address")
print("最終合併結果(IP-MAC-Port):")
print(final_merged_df.head())
print("-" * 30)

結果提取與展示

經過兩次合併,final_merged_df包含了所有我們需要的關聯信息。現在,我們只需要選擇ipv4、Addr(MAC地址)和port這三列,並按照指定格式打印出來。

 # 提取所需列result_df = final_merged_df[["ipv4", "Addr", "port"]]

# 打印最終結果print("最終輸出:")
for index, row in result_df.iterrows():
    # .strip() 用於去除可能存在的額外空格print(f"ip {row['ipv4']} addr {row['Addr'].strip()} port {row['port'].strip()}")

預期輸出:

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

完整代碼示例

import pandas as pd
import io

# 模擬文件內容,實際應用中直接使用文件名file1_content = """1.1.1.1
1.1.1.2
1.1.1.3
1.1.1.6
1.1.1.11"""

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

file3_content = """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"""

# 1. 加載數據到DataFrame
df1 = pd.read_csv(io.StringIO(file1_content), header=None, names=['ipv4'])
df2 = pd.read_csv(io.StringIO(file2_content), sep=r'\s ', engine='python')
df3 = pd.read_csv(io.StringIO(file3_content), sep=r'\s ', engine='python', skiprows=[1])

# 2. 執行DataFrame合併操作# 第一次合併:根據IP地址關聯df1 和df2
merged_df_ip_mac = df1.merge(df2, how="inner", left_on="ipv4", right_on="Address")

# 第二次合併:根據MAC地址關聯第一次合併結果和df3
final_merged_df = merged_df_ip_mac.merge(df3, how="inner", left_on="Addr", right_on="mac address")

# 3. 提取所需列並格式化輸出result_df = final_merged_df[["ipv4", "Addr", "port"]]

print("最終輸出:")
for index, row in result_df.iterrows():
    # 使用.strip() 清除可能存在的列值前後的空白字符print(f"ip {row['ipv4']} addr {row['Addr'].strip()} port {row['port'].strip()}")

注意事項與最佳實踐

  1. 文件格式多樣性:實際文件可能比示例更複雜。 pd.read_csv提供了大量參數(如delimiter, quotechar, skipinitialspace, na_values等),可以靈活處理各種CSV、TSV或其他分隔符文件。
  2. 合併類型選擇(how參數):
    • inner (默認):只保留兩個DataFrame中都存在的匹配項。
    • left:保留左DataFrame的所有行,並匹配右DataFrame的行;如果右DataFrame沒有匹配項,則填充NaN。
    • right:保留右DataFrame的所有行,並匹配左DataFrame的行;如果左DataFrame沒有匹配項,則填充NaN。
    • outer:保留兩個DataFrame的所有行,如果某側沒有匹配項,則填充NaN。 根據你的業務需求選擇合適的合併類型。
  3. 性能考量: Pandas的底層是C語言實現的,因此其操作(尤其是merge)在大數據集上比純Python循環要快得多。對於TB級別的數據,Pandas可能不再是最佳選擇,可以考慮Dask或PySpark等分佈式計算框架。
  4. 數據清洗:在合併之前,確保用於連接的列數據類型一致,且沒有前導/尾隨空格或不一致的大小寫。例如,可以使用.str.strip()去除字符串列的空格,使用.str.lower()進行大小寫統一。
  5. 列名衝突:如果兩個DataFrame中有相同的列名但不是用於合併的鍵,Pandas會在合併後自動添加_x和_y後綴來區分它們。可以使用suffixes參數自定義這些後綴。

總結

通過本教程,我們學習瞭如何利用Pandas庫高效地解決多文件數據關聯問題。將原始數據轉換為DataFrame,並巧妙運用merge操作,不僅使代碼邏輯清晰、易於維護,而且極大地提高了數據處理的效率。掌握Pandas的這一核心功能,將為你的數據分析和自動化任務帶來巨大的便利。

以上是使用Pandas高效整合多文件數據:IP、MAC與端口關聯教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Stock Market GPT

Stock Market GPT

人工智慧支援投資研究,做出更明智的決策

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

如何從python中的unignts.txt文件安裝包裝 如何從python中的unignts.txt文件安裝包裝 Sep 18, 2025 am 04:24 AM

運行pipinstall-rrequirements.txt可安裝依賴包,建議先創建並激活虛擬環境以避免衝突,確保文件路徑正確且pip已更新,必要時使用--no-deps或--user等選項調整安裝行為。

PEFT LoRA適配器與基礎模型的高效合併策略 PEFT LoRA適配器與基礎模型的高效合併策略 Sep 19, 2025 pm 05:12 PM

本教程詳細介紹瞭如何將PEFT LoRA適配器與基礎模型高效合併,生成一個完全獨立的模型。文章指出直接使用transformers.AutoModel加載適配器並手動合併權重是錯誤的,並提供了使用peft庫中merge_and_unload方法的正確流程。此外,教程還強調了處理分詞器的重要性,並討論了PEFT版本兼容性問題及解決方案。

如何用Pytest測試Python代碼 如何用Pytest測試Python代碼 Sep 20, 2025 am 12:35 AM

Pytest是Python中簡單強大的測試工具,安裝後按命名規則自動發現測試文件。編寫以test_開頭的函數進行斷言測試,使用@pytest.fixture創建可複用的測試數據,通過pytest.raises驗證異常,支持運行指定測試和多種命令行選項,提升測試效率。

如何處理python中的命令行參數 如何處理python中的命令行參數 Sep 21, 2025 am 03:49 AM

theargparsemodulestherecommondedwaywaytohandlecommand-lineargumentsInpython,提供式刺激,typeValidation,helpmessages anderrornhandling; useSudys.argvforsimplecasesRequeRequeRingminimalSetup。

Python中浮點數精度問題及其高精度計算方案 Python中浮點數精度問題及其高精度計算方案 Sep 19, 2025 pm 05:57 PM

本文旨在探討Python及NumPy中浮點數計算精度不足的常見問題,解釋其根源在於標準64位浮點數的表示限制。針對需要更高精度的計算場景,文章將詳細介紹並對比mpmath、SymPy和gmpy等高精度數學庫的使用方法、特點及適用場景,幫助讀者選擇合適的工具來解決複雜的精度需求。

如何使用Python中的PDF文件 如何使用Python中的PDF文件 Sep 20, 2025 am 04:44 AM

PyPDF2、pdfplumber和FPDF是Python處理PDF的核心庫。使用PyPDF2可進行文本提取、合併、拆分及加密,如通過PdfReader讀取頁面並調用extract_text()獲取內容;pdfplumber更適合保留佈局的文本提取和表格識別,支持extract_tables()精準抓取表格數據;FPDF(推薦fpdf2)用於生成PDF,通過add_page()、set_font()和cell()構建文檔並輸出。合併PDF時,PdfWriter的append()方法可集成多個文件

python獲得當前時間示例 python獲得當前時間示例 Sep 15, 2025 am 02:32 AM

獲取當前時間在Python中可通過datetime模塊實現,1.使用datetime.now()獲取本地當前時間,2.用strftime("%Y-%m-%d%H:%M:%S")格式化輸出年月日時分秒,3.通過datetime.now().time()獲取僅時間部分,4.推薦使用datetime.now(timezone.utc)獲取UTC時間,避免使用已棄用的utcnow(),日常操作以datetime.now()結合格式化字符串即可滿足需求。

如何使用Python中的@ContextManager Decorator創建上下文管理器? 如何使用Python中的@ContextManager Decorator創建上下文管理器? Sep 20, 2025 am 04:50 AM

Import@contextmanagerfromcontextlibanddefineageneratorfunctionthatyieldsexactlyonce,wherecodebeforeyieldactsasenterandcodeafteryield(preferablyinfinally)actsas__exit__.2.Usethefunctioninawithstatement,wheretheyieldedvalueisaccessibleviaas,andthesetup

See all articles