使用for循环对比更新DataFrame后df1未变更的问题
df1通过for循环更新无预期变化的问题修复
问题根源
原代码存在几个关键问题导致df1未更新:
- 仅给局部变量赋值,未将修改同步到df1的DataFrame中
- 循环范围只覆盖df2前4行,遗漏第5行数据
- 语法错误(括号不匹配、变量拼写错误)
- 逻辑判断混乱(混淆了转换后的数字标识和目标文本值)
- 重复执行拆分操作,效率低下
修正后的代码
# 提前拆分df2目标列,避免循环内重复操作 df2_split = df2['Unnamed: 4'].str.split('_', n=1, expand=True) for i in range(len(df2)): # 获取当前df2行的KEY值 index_key = df2['5. 방법/수단'][i] # 定位df1中对应KEY的行索引 try: index_rawdata = df1.loc[df1['KEY'] == index_key].index[0] except IndexError: # 若df1中无对应KEY,跳过当前行 continue # 获取df2拆分后的类型标识和药物详情 method_type = df2_split.iloc[i, 0] drug_detail = df2_split.iloc[i, 1] # 将类型标识转换为数字,和df1的MAIN_METHOD匹配 converted_type = int(method_type.replace('sleepingpill', '1').replace('others', '20')) # 匹配MAIN_METHOD后,更新df1的DRUG_ETCDTL if converted_type == df1.loc[index_rawdata, 'MAIN_METHOD']: df1.loc[index_rawdata, 'DRUG_ETCDTL'] = drug_detail
代码说明
- 提前拆分df2:将拆分操作放在循环外,避免重复计算提升效率,且未修改原df2
- 循环范围覆盖全部df2行:用
len(df2)确保遍历所有数据 - 异常处理:添加try-except避免df1中无对应KEY时抛出错误
- 直接修改df1:通过
df1.loc[index_rawdata, 'DRUG_ETCDTL']直接更新DataFrame的对应单元格,确保修改生效 - 逻辑修正:先转换类型标识为数字,和df1的MAIN_METHOD匹配后,将药物详情写入DRUG_ETCDTL
运行上述代码后,df1会更新为预期结果:
KEY MAIN_METHOD DRUG_ETCDTL 0 100944 1 unknown 1 67488 20 unknown 2 101476 20 anorexia 3 102549 1 plunitrazeparm 4 103227 1 pentobarbytal
内容的提问来源于stack exchange,提问作者Chung Joshua
相关产品推荐
相关产品推荐

