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

如何在Pandas中添加依赖低索引已有行值的列?

高效实现依赖前序所有行的列生成

核心方法:使用expanding()扩展窗口

Pandas的expanding()方法专门用于处理从起始行到当前行的滚动扩展窗口,完全匹配你“依赖所有索引更小的行”的需求,它是C层面优化的实现,比Python逐行循环快几个数量级,同时原生支持groupby场景。

基础用法示例

假设你需要实现的函数f逻辑为:计算当前行及之前所有行的old_col均值,再乘以当前行的old_col,可以这样写:

import pandas as pd

# 构造测试数据
df = pd.DataFrame({'old_col': [1,2,3,4,5]}, index=[0,1,2,3,4])

# 自定义函数:输入扩展窗口的子DataFrame,返回单个计算值
def custom_func(window_df):
    mean_val = window_df['old_col'].mean()
    # 取窗口最后一行(即当前行)的old_col做计算
    return mean_val * window_df['old_col'].iloc[-1]

# 生成新列
df['new_col'] = df.expanding().apply(custom_func, raw=False)

参数raw=False确保传入函数的是完整的子DataFrame;若你的逻辑仅需处理数值数组,设raw=True可进一步提升效率。

效率优化:优先用向量化内置方法

如果你的逻辑能拆分为Pandas内置的累积函数(如cumsum()、cummax()、cummin()、expanding().mean()等),绝对优先使用这些方法——它们是完全向量化的,比自定义apply()快数倍:

  • 替代自定义求和:df['new_col'] = df['old_col'].cumsum()(即你提到的示例)
  • 自定义前序均值:df['new_col'] = df['old_col'].expanding().mean()

若必须用复杂自定义逻辑,推荐用numba加速Python函数:

import numpy as np
from numba import jit

# 用numba装饰numpy数组处理函数,启用纯编译执行
@jit(nopython=True)
def numba_accelerated(arr):
    result = np.zeros_like(arr)
    running_sum = 0
    for i in range(len(arr)):
        running_sum += arr[i]
        result[i] = running_sum * arr[i]  # 示例逻辑:前序和乘以当前值
    return result

# 传入numpy数组,效率远高于纯Python的apply
df['new_col'] = numba_accelerated(df['old_col'].to_numpy())

支持groupby场景

直接在groupby对象后链式调用expanding(),会自动对每个分组单独计算扩展窗口:

# 构造带分组的测试数据
df = pd.DataFrame({
    'group': ['A','A','A','B','B'],
    'old_col': [1,3,5,2,4]
})

# 按分组计算前序所有行的old_col总和
df['group_cumsum'] = df.groupby('group')['old_col'].expanding().sum().reset_index(level=0, drop=True)

reset_index(level=0, drop=True)用于移除groupby生成的层级索引,让结果与原DataFrame对齐。

注意事项

  • 确保DataFrame按目标顺序排序:expanding()按行的物理顺序处理,若你的“索引更小”指的是索引值而非行顺序,需先执行df = df.sort_index()。
  • 避免在apply()中做复杂的DataFrame操作:比如不要在函数内再次切片、过滤,尽量用窗口内的数组运算,否则会抵消expanding()的效率优势。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:25:53