如何在自定义函数中遍历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
相关产品推荐
相关产品推荐

