如何在函数内循环遍历索引列表处理pandas DataFrame数据
Pandas多索引分组循环处理实现方案
原有代码问题
- 循环内直接覆写原始
data变量:第一次循环执行data=data.iloc[i]后,data就只剩第一组索引对应的行,第二次循环再做行切片时索引已经完全错位,无法取到第二组对应的原始数据 - 结果变量被反复覆盖:循环内每次都给
A1、A2重新赋值,循环结束后只会保留最后一组索引的处理结果,前面的计算结果全部丢失 - 切片视图修改风险:直接在
iloc返回的切片视图上做列赋值,会触发Pandas的SettingWithCopyWarning,修改行为不稳定,可能不会按预期生效
正确实现逻辑
- 循环过程中保留原始全量数据不做修改,每次迭代基于原始数据提取对应索引的子数据集,提取后显式调用
.copy()生成独立副本,避免视图修改问题 - 用列表作为结果容器,依次存储每一组索引计算得到的结果,避免结果被覆盖
- 所有分组处理完成后,可按需选择返回分组结果列表,或者将结果按原始索引拼接为完整的DataFrame
完整可运行代码
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_) # 子函数定义 def Multiplication_data(data, n): data["Number_a"] = data["Number_a"] * n return data def Addition_data(data): data["Number_b"] = data["Number_b"] + data["Number_c"] return data # 修正后的主处理函数 def function_data(data, n): idx1 = [0, 2, 4] idx2 = [1, 3, 5] idx_groups = [idx1, idx2] # 初始化结果存储列表 a1_results = [] a2_results = [] for group_idx in idx_groups: # 基于原始数据提取对应行,生成独立副本 sub_df = data.iloc[group_idx].copy() # 执行计算 processed_a1 = Multiplication_data(sub_df, n) processed_a2 = Addition_data(sub_df) # 结果存入列表 a1_results.append(processed_a1) a2_results.append(processed_a2) # 拼接所有分组结果,按原始索引排序还原顺序 final_a1 = pd.concat(a1_results).sort_index() final_a2 = pd.concat(a2_results).sort_index() return final_a1, final_a2
调用示例:执行
a1, a2 = function_data(data, 2)即可得到和原始数据行顺序一致的处理结果。如果需要保留分组形式的结果,直接返回a1_results, a2_results即可,返回值为两个列表,每个元素对应一组索引的处理结果。
内容的提问来源于stack exchange,提问作者the phoenix
相关产品推荐
相关产品推荐

