如何用Python按Pool列匹配 仅更新Excel中CSV含对应项的数据
基于Pandas按Pool匹配更新Excel数值的实现
核心逻辑是先读取Excel中已有的目标表数据,以Pool列为关联键,仅更新CSV中存在对应Pool的行数值,CSV中没有的Pool保留Excel原有内容,最后将更新完成的完整数据写回原位置即可,完全兼容你现有的pandas处理逻辑。
完整实现代码
import pandas as pd # 1. 读取CSV文件,和你原有逻辑保持一致 dfcsv = pd.read_csv("file.csv", sep=";", decimal=",") # 2. 读取Excel中已有的Pool表格 # 注意参数:header填你表格表头所在的0索引行号,和你之前写入的位置对应;usecols指定读取前三列避免读入无关内容 df_excel = pd.read_excel( filename, sheet_name="Compute", header=3, # 0索引,对应Excel从1开始计数的第4行,即存放Pool/Storage/Used表头的行 usecols="A:C" ) # 3. 统一Pool列数据类型,避免数字/字符串格式不一致导致匹配失败 pool_type = type(dfcsv["Pool"].iloc[0]) df_excel["Pool"] = df_excel["Pool"].astype(pool_type) # 4. 关联更新:以Pool为索引,用CSV数据覆盖匹配到的行,未匹配到的Excel原有数据保留 df_updated = df_excel.set_index("Pool").combine_first(dfcsv.set_index("Pool")).reset_index() # 仅保留需要的三列,避免CSV中多余字段写入Excel df_updated = df_updated[["Pool", "Storage", "Used"]] # 5. 将更新后的数据写回Excel原位置,参数和你之前的写入逻辑完全兼容 with pd.ExcelWriter( filename, mode="a", if_sheet_exists="overlay", datetime_format="dd.mm.yyyy hh:mm", engine="openpyxl" ) as writer: df_updated.to_excel( writer, sheet_name="Compute", startcol=0, startrow=4, # 0索引,对应Excel从1开始计数的第5行,即第一条数据存放的行,不要覆盖表头 index=False, header=False )
注意事项
- 请根据你表格的实际位置调整
header和startrow参数:header是表头所在的0索引行号,startrow是第一条数据开始写入的0索引行号,比header大1即可,避免覆盖原有表头。 - 如果读写时提示缺少openpyxl依赖,执行
pip install openpyxl安装即可,pandas的追加覆写模式需要该引擎支持。 - 如果出现部分Pool匹配失败的情况,先打印
dfcsv["Pool"]和df_excel["Pool"]检查是否存在多余空格、格式不一致的问题。 - 该方案只会覆盖A-C列对应的数据行,表格其他位置的内容、公式、格式都不会被改动。
内容的提问来源于stack exchange,提问作者Krieger
相关产品推荐
相关产品推荐

