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

使用For循环将Pandas数据从Jupyter导入MySQL Workbench时出现KeyError:0(0 is not in range)问题求助

解决Pandas切片后循环插入MySQL时的KeyError问题

我明白你碰到的这个坑了——用iloc拆分数据集后,第二部分的循环插入代码直接报错KeyError: 0,这其实是个很常见的Pandas索引问题,咱们一步步来解决。

错误原因分析

你拆分数据的逻辑是对的,但忽略了一个关键细节:

  • 第一部分Before_handwashing=copy_monthly_df.iloc[:76]的索引和原DataFrame一致,是从0到75的连续整数,所以你用x从0开始循环,通过Before_handwashing[col][x]按索引取值是能找到对应数据的。
  • 但第二部分After_handwashig=copy_monthly_df.iloc[76:]的索引是继承原DataFrame的索引,也就是从76开始的,而你的循环里x是从0开始计数的。比如第一次循环x=0,你尝试取After_handwashig[col][0],但这部分数据的索引里根本没有0,自然就触发了KeyError。

三种解决方案

方案1:重置第二部分数据的索引

最简单的修复方式是给After_handwashig重置索引,让它从0重新开始:

# 重置索引,drop=True表示丢弃原来的旧索引
After_handwashig = copy_monthly_df.iloc[76:].reset_index(drop=True)

之后你原来的循环代码就能正常运行了,因为此时x的数值和DataFrame的索引完全对应。

方案2:改用位置取值(不依赖索引)

如果不想修改索引,可以直接用iloc按位置取值,不管索引是什么都能准确拿到数据:

for x in range(After_handwashig.shape[0]):
    insert_query+='('
    # 先按位置获取第x行的所有数据
    current_row = After_handwashig.iloc[x]
    for y in range(After_handwashig.shape[1]):
        insert_query+= str(current_row[y])+', '
    insert_query=insert_query[:-2]+'), '

这种方式更稳妥,哪怕后续数据的索引有变化,也不会影响取值逻辑。

方案3:用Pandas批量插入(推荐)

其实你现在用循环拼接INSERT语句的方式效率很低,尤其是数据量大的时候,还容易出现格式错误。推荐直接用Pandas自带的to_sql方法,一步完成批量插入:

from sqlalchemy import create_engine

# 替换成你的数据库连接信息:mysql+pymysql://用户名:密码@主机/数据库名
engine = create_engine('mysql+pymysql://root:your_password@localhost/your_database')

# 插入第一部分数据,if_exists='append'表示追加到表中,index=False不插入索引列
Before_handwashing.to_sql(name='your_table_name', con=engine, if_exists='append', index=False)
# 插入第二部分数据
After_handwashig.to_sql(name='your_table_name', con=engine, if_exists='append', index=False)

这种方式不仅代码简洁,还能自动处理数据类型转换,避免SQL注入风险,性能也比循环拼接高很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:57:32