如何基于单列不同字符串中断嵌套循环并分块遍历DataFrame
数据示例
| 索引 | name | seta | setb | setc |
|---|---|---|---|---|
| 0 | aaa | 1111 | 1111 | 1111.0 |
| 1 | aaa | 1112 | 1121 | 1211.0 |
| 2 | aaa | 1113 | 1131 | 1311.0 |
| 3 | aaa | 1114 | 1141 | 1411.0 |
| 4 | aaa | 1115 | 1151 | 1511.0 |
| 5 | aaa | 1116 | 1161 | 1611.0 |
| 6 | aaa | 1117 | 1171 | 1711.0 |
| 7 | aaa | 1118 | 1181 | 1811.0 |
| 8 | aaa | 1119 | 1191 | 1911.0 |
| 9 | aaa | 1120 | 1201 | 2011.0 |
| 10 | bbbb | 1111 | 1111 | 1111.0 |
| 11 | bbbb | 1112 | 1121 | 1211.0 |
| 12 | bbbb | 1113 | 1131 | 1311.0 |
| 13 | bbbb | 1114 | 1141 | 1411.0 |
| 14 | bbbb | 1115 | 1151 | 1511.0 |
| 15 | bbbb | 1116 | 1161 | NaN |
| 16 | bbbb | 1117 | 1171 | NaN |
| 17 | bbbb | 1118 | 1181 | NaN |
| 18 | bbbb | 1119 | 1191 | NaN |
| 19 | bbbb | 1120 | 1201 | NaN |
问题描述
我希望寻求您的帮助,如何先遍历第0至9行,中断后再继续遍历第10至19行。
现有代码
# 我现有的代码 name_col = [] seta_col = [] setb_col = [] setc_col = [] for i in data['name']: if i not in name_col: name_col.append(i) for i in data['seta']: seta_col.append(i) for i in data['setb']: setb_col.append(i) for i in data['setc']: setc_col.append(i) df_list = [] for name in name_col: for sa in seta_col: for sb in setb_col: for sc in setc_col: if name!=name: break print(name,sa,sb,sc)
我尝试添加break语句但没有效果,也尝试在每个新字符串后添加空列表,但都不起作用。
解决方案
你的核心问题是原代码逻辑错误:嵌套循环会把所有列的元素随意组合,且if name!=name永远不成立,导致break完全无效。以下是几种直接可行的实现方式:
方法1:按name分组遍历(最贴合需求)
利用pandas的分组功能,天然实现先处理完一组再处理下一组:
import pandas as pd # 假设data是你的DataFrame对象 for group_name, group_rows in data.groupby('name'): print(f"===== 开始处理 {group_name} 组 =====") # 遍历当前组的每一行 for idx, row in group_rows.iterrows(): # 这里写你对每行的处理逻辑,比如打印或存入列表 print(row['name'], row['seta'], row['setb'], row['setc']) print(f"{group_name} 组处理完成\n")
方法2:手动按索引分段遍历
如果不想用分组,直接按索引范围分段处理:
# 处理0-9行 print("===== 处理0-9行 =====") for idx in range(10): row = data.iloc[idx] print(row['name'], row['seta'], row['setb'], row['setc']) # 中断后处理10-19行 print("\n===== 处理10-19行 =====") for idx in range(10, 20): row = data.iloc[idx] print(row['name'], row['seta'], row['setb'], row['setc'])
方法3:修正原代码逻辑
如果要保留类似原代码的思路,应该按行筛选而非提取列元素:
df_list = [] # 先处理aaa的行 print("===== 处理aaa组 =====") for idx, row in data[data['name'] == 'aaa'].iterrows(): df_list.append(row.to_dict()) print(row['name'], row['seta'], row['setb'], row['setc']) # 再处理bbbb的行 print("\n===== 处理bbbb组 =====") for idx, row in data[data['name'] == 'bbbb'].iterrows(): df_list.append(row.to_dict()) print(row['name'], row['seta'], row['setb'], row['setc'])
内容的提问来源于stack exchange,提问作者user1862349
相关产品推荐
相关产品推荐

