如何通过循环基于多组索引列表选取pandas DataFrame对应行
pandas循环按多组索引筛选行实现方案
核心逻辑是先把分散的多组索引列表归集到可遍历的容器(列表/字典)中,循环时每次取出一组索引,用pandas原生的行选择语法筛选子集,再在循环内执行你的自定义处理逻辑即可。
基础实现(无分组标识场景)
把所有索引列表按顺序存入一个大列表,直接遍历即可,适合不需要标记当前索引组名称的场景:
import pandas as pd # 原数据与索引定义 data_ = {'Number_a': [12, 13, 14,15,16,17],'Number_b':[11,11,11,12,12,12],'Number_c': [10,5,4,3,2,1]} data = pd.DataFrame(data=data_) idx1= [0,2,4] idx2=[1,3,5] idx3 = [] # 替换为你的第三组索引内容 # 归集所有待使用的索引列表,后续新增索引组直接追加到这个列表里即可 all_idx_groups = [idx1, idx2, idx3] # 循环处理 for round_num, current_idx in enumerate(all_idx_groups, start=1): # 筛选对应行:如果索引存的是显式索引值用.loc,如果是行位置序号用.iloc sub_df = data.loc[current_idx].copy() # 以下写循环内的自定义处理逻辑即可 print(f"第{round_num}轮筛选结果:") print(sub_df) # 示例:process_func1(sub_df)、process_func2(sub_df) ...
带分组标识的实现
如果需要在处理时明确当前对应的索引组名称(比如做结果标记、日志输出),可以用字典存储索引组名和对应索引列表的映射关系:
# 按组名归集索引 idx_group_map = { "奇数位置行索引": idx1, "偶数位置行索引": idx2, "第三组自定义索引": idx3 } for group_name, current_idx in idx_group_map.items(): sub_df = data.loc[current_idx].copy() print(f"当前处理分组:{group_name}") # 自定义处理逻辑
注意事项
- 索引匹配规则:如果你的索引列表里存的是DataFrame的显式索引值(比如给df设过name、id类的非0起始索引),用
data.loc[索引列表]选行;如果存的是从上到下的行位置序号(0、1、2...),用data.iloc[索引列表]选行,避免匹配错误。 - 筛选子集后如果要做赋值、修改操作,务必加
.copy(),否则会触发pandas的SettingWithCopyWarning,还可能出现修改子集时意外改动原DataFrame数据的问题。
内容的提问来源于stack exchange,提问作者the phoenix
相关产品推荐
相关产品推荐

