You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现Excel与CSV间类VLOOKUP的IP匹配查询求助

解决类似VLOOKUP的IP匹配问题(附易懂Python代码)

Hey there! I totally get the frustration when trying to replicate Excel's VLOOKUP in pandas and hitting weird errors. Let's break this down simply and fix it with code that's easy to follow.

为什么你的map方法会报错?

那个InvalidIndexError通常是因为两个用于匹配的列(CSV里的aips和Excel里的Address)要么数据类型不统一(比如一个是字符串,一个被识别成了其他类型),要么df2.set_index('Address')后的索引和df1['aips']的内容没法完全对齐。map依赖索引匹配,对新手来说确实容易踩坑——咱们换个更像VLOOKUP逻辑的方法:merge,它直接按列值匹配,更稳妥。

完整易懂的代码步骤

下面的代码每一步都加了注释,你直接复制改文件路径就行:

# 导入需要的库(pandas用来处理表格,openpyxl用来读Excel文件)
import pandas as pd

# 1. 读取你的CSV和Excel文件
# 替换成你自己的文件路径哦
csv_file = "你的CSV文件路径.csv"
excel_file = "你的Excel文件路径.xlsx"

# 读取CSV,保留所有列
df_csv = pd.read_csv(csv_file)
# 读取Excel,指定要用到的列(Address和code),避免读多余数据
df_excel = pd.read_excel(excel_file, usecols=["Address", "code"])

# 2. 先清洗IP列(很重要!避免因为空格、格式不统一导致匹配失败)
# 把两个IP列都转成字符串,并且去掉前后的空格
df_csv["aips"] = df_csv["aips"].astype(str).str.strip()
df_excel["Address"] = df_excel["Address"].astype(str).str.strip()

# 3. 执行类似VLOOKUP的匹配操作
# how="left" 意思是保留CSV里的所有行,匹配不到的code会显示NaN(类似Excel里的#N/A)
# on 指定用来匹配的列名(左边是CSV的aips,右边是Excel的Address)
result_df = pd.merge(df_csv, df_excel, left_on="aips", right_on="Address", how="left")

# 4. 整理结果:删掉重复的Address列,把code列放到合适的位置(可选)
result_df = result_df.drop(columns=["Address"])

# 5. 把结果保存成新的CSV文件
result_df.to_csv("匹配后的结果.csv", index=False)

关键细节解释

  • astype(str).str.strip():这一步是为了避免比如IP地址前后有空格(比如" 192.168.1.1 "和"192.168.1.1")导致匹配失败,新手很容易忽略这个小问题!
  • pd.merge(..., how="left"):完全对应Excel里VLOOKUP的精确匹配逻辑,保留原始CSV的所有行,匹配到的就填上code,没匹配到的留空。
  • 为什么不用map?map更适合用索引来映射,而merge是按列值直接匹配,逻辑和VLOOKUP完全一致,对新手来说更直观,也不容易出索引相关的错误。

如果运行后还有问题,比如还是有匹配不到的情况,可以先打印几行df_csv["aips"]和df_excel["Address"]看看内容是不是真的一致(比如有没有大小写?或者IP格式不一样?比如192.168.1.1和192.168.001.001)。

内容的提问来源于stack exchange,提问作者steveJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:59:26