python - 有没有办法有效地引用 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
解决方案
- numpy_ext可用于扩展计算
- pandas-rolling-apply-using-multiple-columns供参考
- 我还包含了一个更简单的计算来以更简单的方式演示行为
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 |
推荐阅读
- swift - SwiftUI 可选环境对象
- php - Laravel 6 Eloquent - 三个表和枢轴之间的关系
- c# - 关于类实例的性能变化
- c# - System.Data.DataColumnCollection' 不包含 'Count' 的定义
- variables - 如何在不解析变量的情况下使用 Jekyll/Liquid 创建 html 模板
- flutter - Flutter 中 onGenerateRoute 和路由的区别
- haskell - `evaluate`、`rwhnf` 和 `seq` 与它们的“深度”对应物有什么区别?
- flutter - 如何在 Flutter 中更新 pubspec.yaml 文件中的单个包
- mysql - SQL:我的查询中出现错误 1064,我找不到原因
- php - 重新验证响应未提交