pandas结合loc与iloc提取指定行触发索引过多报错问题
问题解决
报错原因
iloc要求传入的行索引是一维的整数/整数列表,你报错的核心是传入了嵌套的索引结构:
- 你通过
index.tolist()获取到的变量A本身就是列表类型,哪怕仅匹配到"Inventories"所在的第56行,A的实际值是[56],而非整数56 - 当你写
df.iloc[[0,1,A]]时,实际传入的参数是[0,1,[56]],属于二层嵌套列表,不符合iloc的传参规则,因此触发索引器错误;你手动替换为整数56时,传入的是一维列表[0,1,56],符合传参要求所以能正常运行。 - 你最早写的
df.iloc[[0,1,[A]]]嵌套层级更深,必然报错。
正确写法
场景1:确定"Inventories"仅对应唯一一行
直接取匹配结果的第一个元素拿到整数行号即可,代码如下:
df.columns = df.iloc[1] first_col = df.columns[0] # 直接取匹配到的第一个行索引的整数值 inv_row = df.index[df[first_col] == 'Inventories'][0] df = df.iloc[[0, 1, inv_row]]
场景2:不确定匹配行数,需要提取所有值为"Inventories"的行
先拼接固定行和匹配到的行索引,组成一维列表后再传入iloc:
df.columns = df.iloc[1] first_col = df.columns[0] inv_rows = df.index[df[first_col].isin(['Inventories'])].tolist() # 拼接为一维索引列表 selected_rows = [0, 1] + inv_rows df = df.iloc[selected_rows]
补充说明:如果你的DataFrame索引不是默认的整数位置索引,用
df.index.get_loc(xxx)拿位置索引会更稳妥,避免索引标签值和位置值不一致导致的取数错误。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

