使用pandas iloc遇索引异常:批量取行报错但单取行正常?
Pandas索引操作问题解答
1. df.iloc[:][0]报KeyError:0的原因
df.iloc[:]返回整个DataFrame对象,此时后续的[0]是DataFrame默认的列索引取值操作——它会尝试寻找列名为0的列,而非按位置取第一列。如果你的DataFrame列名中没有0,就会触发KeyError。
正确按位置取第一列的写法:
df.iloc[:, 0] # 逗号左侧指定行范围(:表示所有行),右侧指定列位置(0表示第一列)
如果是想取第一行,写法为:
df.iloc[0, :] # 或简化为df.iloc[0]
2. 排查循环无输出的原因
你的循环基于content_df.shape[0]遍历,但操作的是df,可能存在以下问题:
- 对象不匹配:
content_df和df不是同一个DataFrame,两者行数不同。比如df行数少于content_df,遍历到超出df行数的索引时会触发异常,但如果except块未正确捕获(如缩进错误),就不会有输出。 - 操作逻辑差异:
df.iloc[i][0]和df.iloc[:][0]逻辑完全不同:df.iloc[i]返回一行数据(Series),此时[0]是取Series中索引为0的元素(即原DataFrame列名为0的列对应值)。如果df列名没有0,理论上循环应打印所有i,但无输出大概率是content_df与df行数一致,或except块未正常执行。
建议修改循环为直接遍历df行数,并明确捕获异常:
for i in range(df.shape[0]): try: df.iloc[i, 0] # 用iloc直接指定行和列,避免Series索引混淆 except Exception as e: print(f"行{i}报错:{e}")
3. df.iloc[:][2:]删行不删列的原因
df.iloc[:]返回整个DataFrame,后续的[2:]是DataFrame的行切片操作(整数切片时,[]默认处理行),因此会返回从第3行开始的所有行,而非删除前两列。
正确保留从第3列开始所有列的写法:
df.iloc[:, 2:] # 逗号左侧:表示所有行,右侧2:表示从第3列(索引2)开始的所有列
内容的提问来源于stack exchange,提问作者haojie
相关产品推荐
相关产品推荐

