基于Pandas实现跨Excel文件按Titel匹配填充历史价格数据
解决方案:Excel文件按Titel匹配填充历史价格数据
- 先处理历史数据File B:因为要求重复Titel取首个匹配项,所以先对File B去重,只保留每个Titel第一次出现的记录,同时只加载需要的列(Titel、Mean、High、Low),减少内存占用。
- 再将处理后的File B与当前产品列表File A做左连接,确保File A的所有行都保留,无匹配项的字段用"not available"填充。
具体代码实现
import pandas as pd # 读取File B,仅加载需要的列,节省内存 df_b = pd.read_excel("File B.xlsx", usecols=["Titel", "Mean", "High", "Low"]) # 去重:保留每个Titel的第一条记录 df_b_unique = df_b.drop_duplicates(subset="Titel", keep="first") # 读取File A df_a = pd.read_excel("File A.xlsx") # 左连接,以Titel为匹配键 df_c = pd.merge(df_a, df_b_unique, on="Titel", how="left") # 填充缺失值为"not available" df_c[["Mean", "High", "Low"]] = df_c[["Mean", "High", "Low"]].fillna("not available") # 保存结果到File C df_c.to_excel("File C.xlsx", index=False)
之前方法失败的常见原因
- 使用
merge时未先对File B去重:会导致匹配到多个重复Titel,结果行数远超File A的5万行,出现不符合预期的情况; - 使用
map时未处理重复索引:如果直接用df_b.set_index("Titel")["Mean"],当Titel重复时,map会取到最后一个匹配项,不符合"取首个"的要求; - Titel格式不一致:如果Excel里的Titel存在首尾空格、大小写差异,会导致匹配失败,可提前统一格式:
# 可选:统一Titel格式,去除首尾空格、转小写 df_a["Titel"] = df_a["Titel"].str.strip().str.lower() df_b["Titel"] = df_b["Titel"].str.strip().str.lower()
大文件内存优化建议
如果File B加载内存压力大,可分块读取并去重:
# 分块读取File B并去重 chunk_size = 100000 df_b_unique = pd.DataFrame() for chunk in pd.read_excel("File B.xlsx", usecols=["Titel", "Mean", "High", "Low"], chunksize=chunk_size): chunk_unique = chunk.drop_duplicates(subset="Titel", keep="first") # 合并时再次去重,避免不同块出现重复Titel df_b_unique = pd.concat([df_b_unique, chunk_unique]).drop_duplicates(subset="Titel", keep="first")
内容的提问来源于stack exchange,提问作者Thrill
相关产品推荐
相关产品推荐

