【问题标题】:Vectorizing "balance sheet"-like data向量化“资产负债表”类数据
【发布时间】:2022-11-13 03:05:14
【问题描述】:

问题如下:如何向量化数据帧下一行的值取决于前一个值的情况?我想避免 for 循环。

给定与行 [0] 中的 0 或 NaN 不同的“未结余额”,我需要的所需列的行逻辑是:

(1) row_t.open_balance = row_t-1.close_balance

(2) row_t.close_balance = row_t.open_balance + row_t.additions - row_t.subtractions

除了速度慢之外,臭名昭著的 for 循环还会导致我遇到各种 SettingWithCopyWarning 情况。

有人可以在这里帮忙吗?由于上面的等式#2,我尝试过“帮助列”无济于事。

提前致谢!

【问题讨论】:

  • 首先,如果是多行,请在代码的开头和结尾使用```表示代码,如果是单行,请使用`。这有助于提高可读性。其次,我们需要一个可重现的例子。如果我们没有可以最终使用的代码示例,我们应该如何帮助您?

标签: python pandas refactoring vectorization


【解决方案1】:

首先,必须创建可重现的示例,以便我可以尝试回答这个问题。下次你问问题时记得这样做。

这里我模拟加法和减法。

import pandas as pd
import numpy as np

additions = np.random.randint(0, 100, 10)
subtractions = np.random.randint(0, 50, 10)
net_change = pd.DataFrame({'balance': list(additions - subtractions)})

net_change

    balance
0   44
1   13
2   70
3   -36
4   73
5   -6
6   54
7   30
8   39
9   80

创建起始余额为 0 的 DataFrame。

df = pd.DataFrame({'balance': [0]})
df

balance
0   0

将 DataFrame 与 net_change 连接起来。

df = pd.concat([df, net_change], ignore_index=True)
df

    balance
0   0
1   44
2   13
3   70
4   -36
5   73
6   -6
7   54
8   30
9   39
10  80

然后使用pandas.DataFrame.cumsum 获得累积收盘余额,我认为这是您要计算的。

df.cumsum()

    balance
0   0
1   44
2   57
3   127
4   91
5   164
6   158
7   212
8   242
9   281
10  361

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    相关资源
    最近更新 更多