使用Python遍历Excel填充drg_id列仅写入7条数据的问题排查
代码逻辑错误定位
你的代码有4处核心逻辑问题,直接导致填充结果不符合预期:
- 循环范围完全写反:你写的循环条件是
for i in range(35021, len(drgs)),Python的range(start, end)是从start开始逐次递增、到小于end时停止。你的数据总行数是35021,len(drgs)本身就是35021,start等于end时循环体一次都不会执行,drg_list根本不会被填充全量数据。 - 随机索引存在越界风险:
rand_reviewer函数里random.randint(0,35021)的上界写错了,长度为35021的列表合法索引范围是0~35020,取索引35021会直接触发IndexError,就算没触发报错也取不到有效值。 - 最终赋值用错了数据源:你前面写循环、写随机判断都是为了生成
drg_list,结果最后创建Series赋值给新列的时候,用的是drg_id_col也就是原Excel里的DRG列本身,完全没用到你生成的drg_list,逻辑链路断了。 - 无意义的冗余逻辑:如果你的需求只是把DRG.xlsx里的DRG列按行对应填充到目标CSV的DataFrame里,根本不需要写随机抽取、while循环判断的逻辑,pandas原生的赋值操作可以直接完成,效率远高于手写Python循环。
修正方案
如果只是做简单的列值按行填充,直接用下面的最简代码即可:
import pandas as pd # 读取源Excel数据 drg_source = pd.read_excel('C:/Cardiac DRG.xlsx', sheet_name=0) # 重置索引保证行对齐,避免索引不匹配导致的值错位 df3 = df3.reset_index(drop=True) drg_source = drg_source.reset_index(drop=True) # 直接把源数据的DRG列赋值给目标表的新列 df3['drg_id'] = drg_source['DRG'].values
如果你确实需要实现「随机抽取DRG值填充,且填充值和原行DRG值不重复」的逻辑,修正后的代码如下:
import pandas as pd import random drg_source = pd.read_excel('C:/Cardiac DRG.xlsx', sheet_name=0) all_drg_values = drg_source['DRG'].tolist() total_rows = len(all_drg_values) fill_list = [] for i in range(total_rows): # 修正随机索引范围,避免越界 current_rand = all_drg_values[random.randint(0, total_rows - 1)] # 循环直到随机值和当前行原始值不相等 while current_rand == all_drg_values[i]: current_rand = all_drg_values[random.randint(0, total_rows - 1)] fill_list.append(current_rand) df3['drg_id'] = pd.Series(fill_list)
额外注意事项
- 做pandas列赋值前先确认两个表的行数完全一致,避免出现值错位、末尾值缺失的问题
- 不要硬编码行数(比如你代码里写死的35021),用
len()动态获取长度,后续数据行数变化时不需要改代码 - 涉及全量数据遍历的操作优先用pandas内置方法,比手写for循环效率高10~100倍
内容的提问来源于stack exchange,提问作者muffntuf
相关产品推荐
相关产品推荐

