使用熊猫从存款和取款中计算余额列

时间:2019-06-22 15:30:37

标签: python pandas dataframe

我正在尝试根据熊猫数据框中的提取量和补充量列来计算剩余现金。

要计算多余现金,逻辑是每当有补货时,用补货额与提取额之差进行计算。未进行补货的行使用上一行的多余现金来取现行的差额。

示例:

   Withdrawn  Replenished
0         10           80
1         20            0
2         30            0
3         10            0
4         20           30

如上表所示,我已使用以下代码根据逻辑来计算多余现金,该逻辑是,每当有补货时,便用已提取的金额减去补货列的差额。

df['Excess'] = 0

df['Excess'] = np.where(df['Replenished'] > 0, df['Replenished'] - df['Withdrawn'], 0)

现在第二部分是我面临的问题。补充列为0的行。我需要使用上一行的多余现金,并与本行的提款金额相抵。为此,我使用了以下代码:

df['Excess'] = np.where(df['Replenished'] == 0, df['Excess'].shift(1) - df['Withdrawn'], df['Excess'])

其结果如下表所示:

   Withdrawn  Replenished  Excess
0         10           80    70.0
1         20            0    50.0
2         30            0   -30.0
3         10            0   -10.0
4         20           30    10.0

第一次,当“已补充的”列为0(第二行)时,计算正确进行。但是在第三行和第四行中,名为Replenished的列中的值是0,由于上一行是0,是用当前行的提现值减去上一行的多余现金后,我得到-30-10

以下是所需的输出:

+-----------+-------------+--------+
| Withdrawn | Replenished | Excess |
+-----------+-------------+--------+
|        10 |          80 |     70 |
|        20 |           0 |     50 |
|        30 |           0 |     20 |
|        10 |           0 |     10 |
|        20 |          30 |     10 |
+-----------+-------------+--------+

1 个答案:

答案 0 :(得分:2)

这同样适用于多个补货。执行“已补货”和“已取款”的累积总和,然后从另一个中减去一个:

cum_deposit = df.groupby(df['Replenished'].ne(0).cumsum())['Withdrawn'].cumsum()
df['Excess'] = df['Replenished'].replace(0, np.nan).ffill() - cum_deposit
df

   Withdrawn  Replenished  Excess
0         10           80    70.0
1         20            0    50.0
2         30            0    20.0
3         10            0    10.0
4         20           30    10.0