Python pandas遍历DataFrame按条件提取分组列数据
问题场景
基于pandas操作已按Date列排序、完成扩展列新增的DataFrame,需实现逐行遍历逻辑:
- 遍历全程维护临时列表
list_test - 当前行
Fixed列值为'No'时,将该行Code列对应值追加至list_test - 当前行
Fixed列值为'Yes'时,将当前list_test的副本以Fixed_Before_<行索引>命名存储,清空list_test后继续遍历 - 最终输出所有修复节点前的故障Code分组列表
原有for循环+字典实现出现整列数据重复追加异常,问题集中在遍历方式、行取值、动态变量存储三个环节。
根因说明
前期排查的三个问题点完全命中错误原因:
- 遍历方式错误:直接迭代DataFrame对象仅会返回列名,未通过行迭代器逐行取数时极易误操作整列数据
- 取值逻辑错误:循环内直接传入
df['Code']会获取整列Series对象,追加到列表时会塞入全列数据,而非当前行的单个Code值 - 存储逻辑错误:直接赋值列表属于浅引用,后续清空原列表时会导致之前存储的结果同步被清空;零散动态创建变量易出现作用域污染,不便于后续批量处理。
可直接运行的实现代码
用字典统一存储所有分组结果,通过iterrows()逐行遍历,存储时传入列表副本避免引用问题:
# 初始化临时收集列表、结果存储字典 list_test = [] fixed_before_groups = {} # 逐行遍历,iterrows()返回值为(行索引, 行内容Series) for row_idx, row in df.iterrows(): if row['Fixed'] == 'No': # 仅追加当前行的Code值,禁止传入df['Code']整列对象 list_test.append(row['Code']) elif row['Fixed'] == 'Yes': # 存储列表副本,隔离后续清空操作对已存结果的影响 fixed_before_groups[f"Fixed_Before_{row_idx}"] = list_test.copy() # 清空临时列表进入下一轮收集 list_test.clear() # 遍历完成后若存在未匹配到Fixed=Yes的剩余故障码,可按需保留 # if list_test: # fixed_before_groups["Unfixed_Codes"] = list_test.copy()
结果使用说明
所有分组结果统一存在fixed_before_groups字典中,按键名直接取值即可,例如要获取行索引为7的修复节点前的故障码列表,直接调用fixed_before_groups['Fixed_Before_7']即可,无需零散创建全局变量,后续批量遍历、导出结果都更方便。
前置校验:遍历前需确认DataFrame已按
Date列完成符合业务要求的排序,否则分组顺序会出错。排序执行语句:df = df.sort_values(by='Date'),若需要重置索引可追加.reset_index(drop=True)。
内容的提问来源于stack exchange,提问作者PyGuy66
相关产品推荐
相关产品推荐

