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

解决np.where报错ValueError:仅可比较标签一致的Series对象问题

解决Python重命名PDF时的Series匹配错误问题

错误原因

你遇到的ValueError: Can only compare identically-labeled Series objects,是因为直接用np.where比较FichierRepertoire['File']和df['ID']时,两个Series的索引或长度不匹配。Pandas要求逐元素比较的Series必须有完全一致的标签(索引),否则会触发这个错误。

可行解决方案

下面两种方法都能实现ID与文件名的匹配并生成新文件名,避免索引对齐问题:


方法一:用Pandas Merge合并数据集(适合批量处理)

这种方法先把目录文件和Excel数据合并,再统一生成新文件名:

import os
import pandas as pd

# 1. 读取Excel中的ID和Title映射
df = pd.read_excel("your_excel_file.xlsx")

# 2. 扫描目标目录,整理PDF文件信息
pdf_dir = "/path/to/your/pdf/folder"
pdf_files = [f for f in os.listdir(pdf_dir) if f.lower().endswith(".pdf")]

# 生成包含文件名(不含后缀)和完整路径的DataFrame
file_df = pd.DataFrame({
    "FileID": [os.path.splitext(f)[0] for f in pdf_files],  # 假设文件名就是ID
    "OldPath": [os.path.join(pdf_dir, f) for f in pdf_files]
})

# 3. 合并两个数据集,按ID匹配Title
merged = pd.merge(file_df, df, left_on="FileID", right_on="ID", how="left")

# 4. 生成新文件名:匹配到Title就用Title,否则保留原文件名
merged["NewFileName"] = merged.apply(
    lambda x: f"{x['Title']}.pdf" if pd.notna(x['Title']) else f"{x['FileID']}.pdf",
    axis=1
)

# 5. 执行重命名
for _, row in merged.iterrows():
    os.rename(row["OldPath"], os.path.join(pdf_dir, row["NewFileName"]))

方法二:用字典映射(轻量高效)

如果不需要批量查看匹配结果,直接用字典做ID到Title的映射更简单:

import os
import pandas as pd

# 1. 构建ID到Title的字典映射
df = pd.read_excel("your_excel_file.xlsx")
id_title_map = df.set_index("ID")["Title"].to_dict()

# 2. 遍历目录重命名文件
pdf_dir = "/path/to/your/pdf/folder"
for filename in os.listdir(pdf_dir):
    if filename.lower().endswith(".pdf"):
        # 提取文件名中的ID(假设文件名就是ID,如"123.pdf")
        file_id = os.path.splitext(filename)[0]
        # 查找对应Title,找不到则保留原ID作为文件名
        new_title = id_title_map.get(file_id, file_id)
        new_filename = f"{new_title}.pdf"
        # 执行重命名
        os.rename(
            os.path.join(pdf_dir, filename),
            os.path.join(pdf_dir, new_filename)
        )

特殊情况处理

如果PDF文件名不是纯ID(比如invoice_456.pdf),可以用正则提取ID:

import re
file_id = re.search(r"\d+", filename).group()  # 提取文件名中的数字作为ID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:12:14