如何对比两个DataFrame匹配MAC地址并更新库存状态?
库存MAC匹配标记实现方案
需求背景
我是编程新手,所在小企业采用手动库存管理,通过MAC地址追踪200+设备,需手动标记“In Stock”。现用扫码器将MAC存入文本转CSV,需与现有库存CSV对比,匹配的MAC标记为“In Stock”,已完成文件读取代码,求后续实现方案。
现有代码
import pandas as pd # 读取扫码生成的MAC文本文件 read_file = pd.read_csv (r'C:\...\input\scannedmacs.txt') # 转成带MAC表头的CSV文件 read_file.to_csv (r'C:\...\output\convertedmacs.csv', index=None , header = ['MAC']) # 读取转换后的扫码MAC CSV scan_file = pd.read_csv(r'C:\...\output\convertedmacs.csv') # 读取现有库存CSV inv_file = pd.read_csv(r'C:\...\output\InventoryNOC.csv', error_bad_lines=False)
后续实现步骤
1. 统一MAC格式(关键:避免因格式差异匹配失败)
MAC地址经常出现大小写、分隔符(冒号/短横线/无分隔)不一致的情况,先统一成标准格式:
# 定义MAC格式化函数:清理非十六进制字符,转小写,按每两位加冒号 def format_mac(mac_str): # 只保留字母数字,转小写 cleaned_mac = ''.join([c.lower() for c in mac_str if c.isalnum()]) # 每两位插入冒号 return ':'.join([cleaned_mac[i:i+2] for i in range(0, 12, 2)]) # 对扫码文件和库存文件的MAC列统一格式化 scan_file['MAC'] = scan_file['MAC'].apply(format_mac) inv_file['MAC'] = inv_file['MAC'].apply(format_mac)
2. 标记匹配的设备状态
先确认库存表有状态列,没有就新增;然后用isin()判断MAC是否在扫码列表中,标记为“In Stock”:
# 如果库存表没有Status列,新增该列 if 'Status' not in inv_file.columns: inv_file['Status'] = '' # 把扫码到的MAC对应的设备标记为"In Stock" inv_file.loc[inv_file['MAC'].isin(scan_file['MAC']), 'Status'] = 'In Stock' # 可选:如果需要标记未扫码到的设备为"Out of Stock",取消下面注释 # inv_file.loc[~inv_file['MAC'].isin(scan_file['MAC']), 'Status'] = 'Out of Stock'
3. 保存更新后的库存文件
把修改后的库存表保存,建议先存为新文件避免覆盖原数据,测试没问题再替换原文件:
# 保存为新的库存文件(推荐) inv_file.to_csv(r'C:\...\output\UpdatedInventoryNOC.csv', index=False) # 如果确认没问题,也可以直接覆盖原库存文件 # inv_file.to_csv(r'C:\...\output\InventoryNOC.csv', index=False)
4. 优化:跳过中间CSV转换(可选)
你当前代码把txt转成CSV再读取,其实可以直接读取txt文件,省去中间步骤,提升效率:
# 直接读取扫码生成的txt文件,指定列名为MAC,跳过转CSV步骤 scan_file = pd.read_csv(r'C:\...\input\scannedmacs.txt', header=None, names=['MAC']) # 后续的格式化、标记步骤和上面一致
内容的提问来源于stack exchange,提问作者Interior Goblin
相关产品推荐
相关产品推荐

