You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 01:15:39