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

Pandas函数报错:ValueError: 值长度与索引长度不匹配问题排查

问题:筛选DataFrame中体重≥100的动物名称时触发ValueError

场景与数据

需实现findHeavyAnimals函数,筛选DataFrame(df4)中weight≥100的动物记录,仅返回name列组成的新DataFrame。原始数据df4如下:

name    species age weight
0   Tatiana Snake   98  464
1   Khaled  Giraffe 50  41
2   Alex    Leopard 6   328
3   Jonath  Monkey  45  463
4   Stefan  Bear    100 50
5   Tommy   Panda   26  349

当前实现的函数代码:

def findHeavyAnimals(animals: pd.DataFrame) -> pd.DataFrame:
    tb=pd.DataFrame()
    list=[]
    for i in range(animals.shape[0]):
        if animals.iloc[i,3]>=100:
            list.append(animals.iloc[i,0])
            tb['name']=list
    return tb  

运行时触发错误:

ValueError: Length of values (2) does not match length of index (1)

预期输出:
符合条件的名称列表:

['Tatiana', 'Alex', 'Jonath', 'Tommy']

对应的DataFrame:

name
0   Tatiana
1   Alex
2   Jonath
3   Tommy

错误原因

问题出在循环内的tb['name']=list语句:

  • 第一次找到符合条件的记录时,list长度为1,给空DataFrametb添加name列,此时tb的索引长度为1,赋值正常。
  • 第二次找到符合条件的记录时,list长度变为2,但tb已有长度为1的索引,直接赋值会导致列表长度与DataFrame索引长度不匹配,触发ValueError。

修正方案

方案1:调整循环内赋值逻辑

将tb['name']=list移出循环,等所有符合条件的名称收集完成后,再一次性创建DataFrame:

def findHeavyAnimals(animals: pd.DataFrame) -> pd.DataFrame:
    name_list = []
    for i in range(animals.shape[0]):
        if animals.iloc[i, 3] >= 100:
            name_list.append(animals.iloc[i, 0])
    return pd.DataFrame({'name': name_list})

方案2:使用Pandas向量化操作(更高效)

抛弃循环,利用Pandas布尔索引直接筛选,这是更符合Pandas设计风格的写法:

def findHeavyAnimals(animals: pd.DataFrame) -> pd.DataFrame:
    # 筛选weight≥100的行,仅保留name列并重置索引
    return animals.loc[animals['weight'] >= 100, ['name']].reset_index(drop=True)

注:reset_index(drop=True)用于重置结果的索引,使其从0开始连续,与预期输出一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:43:24