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

如何在自定义函数中遍历DataFrame并按两行一组应用函数?

实现方案

你的核心思路没有方向性偏差:按固定步长取连续两行切片传入函数的逻辑完全可行,只是在索引处理、实现优雅度上有可以优化的点。

手写循环的正确写法

不要直接用df['foo'][n:n+2]的写法做切片——这种写法是按索引标签取值,如果你之前对DataFrame做过筛选、排序、删除行操作,索引不是从0开始的连续整数,会直接取错值。正确写法是用.iloc做位置索引,配合步长为2的range生成每组起始位置:

# 存储所有组的计算结果
calc_result = []
# 从第0行开始,每次步进2行,直到遍历完整个目标列
for start in range(0, len(df), 2):
    # 取当前位置开始的2行数据
    current_group = df['foo'].iloc[start:start+2]
    # 如果你的函数强制要求输入必须是2个值,末尾不足2行的组可以按需跳过/特殊处理
    if len(current_group) < 2:
        # 要跳过末尾残组就写break,要特殊处理就补对应逻辑
        break
    calc_result.append(your_func(current_group))

更推荐的pandas原生实现

手写for循环在数据量大的时候执行效率偏低,也需要自己处理边界逻辑,更符合pandas使用习惯的写法是先按每2行做分组,再批量调用函数:

# 生成分组标识:每2行共用同一个分组id,先重置索引避免原索引不连续导致分组错位
group_mark = df.reset_index(drop=True).index // 2
# 分组后对每个组的目标列批量应用函数
calc_result = df.groupby(group_mark)['foo'].apply(your_func).tolist()

这种写法会自动适配总行数不是2的倍数的场景,不需要自己写边界判断,执行速度比手写循环快数倍到数十倍不等。

注意:如果你的自定义函数接收的是两个独立的数值参数,而不是长度为2的序列,只需要在传参的时候把切片拆成两个位置参数传入即可,比如your_func(current_group.iloc[0], current_group.iloc[1])

内容的提问来源于stack exchange,提问作者mebaran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:45:44