我正在尝试根据熊猫数据框中的提取量和补充量列来计算剩余现金。
要计算多余现金,逻辑是每当有补货时,用补货额与提取额之差进行计算。未进行补货的行使用上一行的多余现金来取现行的差额。
示例:
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 |
+-----------+-------------+--------+
答案 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