嵌套while循环中更新pandas索引与行的实现方案咨询
问题核心原因
你原来的代码问题在于pd.iterrows()是预先生成的迭代器,你在嵌套while循环里手动修改index变量,完全不会改变外层for循环的迭代顺序,后续for循环还是会按原来的顺序返回索引,导致重复处理、逻辑错乱。要实现你要的顺序控制逻辑,直接用自定义索引的while循环遍历DataFrame就可以,完全不需要用iterrows。
正确实现代码
import pandas as pd import string data = {'letter':['A', 'C', 'D', 'X', 'X', 'Z', 'A', 'E', 'Z', 'Y', 'D', 'B', 'A']} df = pd.DataFrame(data) bad_letters = [] # 初始化:第一个字母默认是正常基准 current_idx = 1 compare_idx = 0 # 存储上一个正常字母的索引 max_idx = len(df) - 1 while current_idx <= max_idx: # 计算当前字母和基准字母的距离 current_letter_num = string.ascii_uppercase.index(df.loc[current_idx, 'letter']) compare_letter_num = string.ascii_uppercase.index(df.loc[compare_idx, 'letter']) dist = abs(current_letter_num - compare_letter_num) if dist > 5: # 进入异常段,连续记录所有异常索引 while current_idx <= max_idx: current_letter_num = string.ascii_uppercase.index(df.loc[current_idx, 'letter']) dist = abs(current_letter_num - compare_letter_num) if dist <=5: # 找到新的正常基准,更新基准索引,跳出异常段循环 compare_idx = current_idx break # 否则记录异常索引,继续往后走 bad_letters.append(current_idx) current_idx += 1 else: # 正常,更新基准为当前索引 compare_idx = current_idx current_idx += 1 print(bad_letters) # 输出:[3, 4, 5, 8, 9]
其他注意事项
- 你原来的代码遗漏了
df = pd.DataFrame(data)初始化步骤,运行会直接报错 - iterrows返回的索引是df的行标签,不是位置索引,如果你df的索引不是默认的0开始的连续整数,
df['letter'][index-1]这种写法会出问题,建议统一用.iloc或者.loc明确是位置还是标签索引 - 你的需求属于强顺序依赖逻辑,必须按行遍历判断,没有高效的pandas向量化实现方案,自定义索引遍历是最直观可靠的方式
内容的提问来源于stack exchange,提问作者iskandarblue
相关产品推荐
相关产品推荐

