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

Python循环匹配两DataFrame时出现ValueError长度不匹配问题求解

报错原因

你遇到的 ValueError : length of values 1 does not match length of index 1212 直接触发原因是:给DataFrame新增列时,等号右侧的列表/序列长度必须和DataFrame行数一致,你的puits_sig一共1212行,但你最后赋值用的id_pcredo列表长度只有1,长度不匹配就会抛错。

你的代码里存在4个核心逻辑问题:

  • 变量初始化位置错误:你把id_pcredo = []写在了外层j循环的内部,每次遍历puit_2(puits_credo)的行时,都会把之前存好的匹配结果清空,循环全部结束后列表里只会剩下最后一轮j循环存入的零散值,长度根本凑不够1212。
  • 存在无效判断:if puits_credo['noms'][j] == puits_credo['noms'][j]是恒成立的判断,自己和自己比较永远为True,这行代码没有任何实际作用。
  • 基础语法错误:第一行puits_sig[id_credo] = pd.series([])里,id_credo作为列名没加引号,pd.Series首字母需要大写,你写的小写pd.series本身就会触发属性错误。
  • 循环逻辑顺序颠倒:你要实现的是给puit_1(puits_sig)的每一行匹配puit_2的对应id,但你的双层循环是在遍历puit_2时往列表里塞值,完全没有对齐puit_1的行顺序。
正确实现方案

pandas做这类字段匹配不要手写双层循环,效率低还容易出逻辑错,根据你的匹配规则选对应写法即可:

方案1:子串包含匹配(即你代码里写的「sigle_puit字符串是Nom字段的子串」规则)

只需要单层遍历puit_2的映射关系,用布尔索引批量赋值即可:

# 先初始化id列,默认填充空值
puits_sig['id_credo'] = None

# 遍历puit_2的名称和对应id
for nom, target_id in zip(puits_credo['noms'], puits_credo['ID_Objet']):
    # 找到puit_1中所有sigle_puit是当前nom子串的行
    match_rows = puits_sig['sigle_puit'].astype(str).apply(lambda x: x in nom)
    # 给匹配到的行赋值对应id
    puits_sig.loc[match_rows, 'id_credo'] = target_id

方案2:完全相等匹配(如果规则是两个名称字段完全一致才匹配)

不需要写循环,直接用映射方法,运行效率最高:

# 构建puit_2的「名称-id」映射字典
name2id = dict(zip(puits_credo['noms'], puits_credo['ID_Objet']))
# 直接按puit_1的名称字段映射赋值,无匹配的位置会自动填充NaN
puits_sig['id_credo'] = puits_sig['sigle_puit'].map(name2id)

注意:你给的样例数据里puit_2的名称列叫Nom、id列叫ID Object,实际运行时把代码里对应的列名改成你自己表里的真实列名就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 18:21:52