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

