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

如何在函数内循环遍历索引列表处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:18:21