首页 > 解决方案 > 有没有办法有效地引用 Pandas 列中的先前值?

问题描述

我想在引用以前的值的同时在 pandas 中进行一些复杂的计算(基本上我是逐行计算)。然而,循环需要永远,我想知道是否有更快的方法。每个人都在提到使用 shift 但我不明白它是如何工作的。

df = pd.DataFrame(index=range(500)
df["A"]= 2
df["B"]= 5
df["A"][0]= 1
for i in range(len(df):
    if i != 0: df['A'][i] = (df['A'][i-1] / 3) - df['B'][i-1] + 25

标签: pythonpandas

解决方案


df = pd.DataFrame(index=range(5000))
df["A"]= 2
df["B"]= 5
df["A"][0]= 1
import numpy_ext as npe

# for i in range(len(df):
#     if i != 0: df['A'][i] = (df['A'][i-1] / 3) - df['B'][i-1] + 25

# SO example - function of previous values in A and B
def f(A,B):
    r = np.sum(A[:-1]/3) - np.sum(B[:-1] + 25) if len(A)>1 else A[0]
    return r

# much simpler example, sum of previous values
def g(A):
    return np.sum(A[:-1])

df["AB_combo"] = npe.expanding_apply(f, 1, df["A"].values, df["B"].values)
df["A_running"] = npe.expanding_apply(g, 1, df["A"].values)

print(df.head(10).to_markdown())

样本输出

一个 AB_组合 A_running
0 1 5 1 0
1 2 5 -29.6667 1
2 2 5 -59 3
3 2 5 -88.3333 5
4 2 5 -117.667 7
5 2 5 -147 9
6 2 5 -176.333 11
7 2 5 -205.667 13
8 2 5 -235 15
9 2 5 -264.333 17

推荐阅读