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
相关产品推荐
相关产品推荐

