You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用for循环,通过向量化填充银行数据DataFrame空值?

向量化填充银行交易DataFrame的Balance空值

问题描述

有一份银行交易记录的DataFrame,其中Balance列存在空值,需要按规则填充:空值所在行的Balance等于上一行的Balance(已填充或原始非空值)加上本行的Amount。希望用向量化方法实现,避免使用for循环。

示例DataFrame

import pandas as pd

l1 = ['26.10.2022', '27.10.2022', '28.10.2022', '28.10.2022', '28.10.2022','28.10.2022', '31.10.2022', '31.10.2022', '01.11.2022', '01.11.2022', '03.11.2022',  '04.11.2022', '07.11.2022', '07.11.2022', '07.11.2022', '08.11.2022', '09.11.2022', '09.11.2022']
l2 = [54267.36,52867.36, '','' , '',52744.21,'' ,52646.91,'',34898.36,34871.46,51026.46,'','',50612.36,61468.52,'',69563.27]
l3 = [-390,-1400,847,-900.15,-45,-25,-57.3,-40,-12528.55,-5220,-26.9,16155,-275,-105,-34.1,10856.16,7663.95,430.8]

df = pd.DataFrame(list(zip(l1,l2,l3)), columns = ['Date','Balance','Amount'])

原始DataFrame输出:

Date   Balance    Amount
0   26.10.2022  54267.36   -390.00
1   27.10.2022  52867.36  -1400.00
2   28.10.2022              847.00
3   28.10.2022             -900.15
4   28.10.2022              -45.00
5   28.10.2022  52744.21    -25.00
6   31.10.2022              -57.30
7   31.10.2022  52646.91    -40.00
8   01.11.2022           -12528.55
9   01.11.2022  34898.36  -5220.00
10  03.11.2022  34871.46    -26.90
11  04.11.2022  51026.46  16155.00
12  07.11.2022             -275.00
13  07.11.2022             -105.00
14  07.11.2022  50612.36    -34.10
15  08.11.2022  61468.52  10856.16
16  09.11.2022             7663.95
17  09.11.2022  69563.27    430.80

向量化解决方案

核心思路:利用累积和与基准值推导,完全避免循环,效率远高于for循环。

完整代码:

# 1. 将Balance转为数值型,空字符串转为NaN
df['Balance'] = pd.to_numeric(df['Balance'], errors='coerce')

# 2. 计算Amount列的累积和
df['cum_amount'] = df['Amount'].cumsum()

# 3. 计算基准值(交易前的初始余额),并用ffill填充空值
df['base'] = (df['Balance'] - df['cum_amount']).ffill()

# 4. 推导填充后的Balance
df['filled_Balance'] = df['base'] + df['cum_amount']

验证结果

填充后的filled_Balance列完全符合需求:

  • 索引2的Balance:52867.36 + 847 = 53714.36
  • 索引3的Balance:53714.36 - 900.15 = 52814.21
  • 索引4的Balance:52814.21 - 45 = 52769.21
  • 所有已知的Balance值与填充结果完全匹配

原理说明

每一行的Balance本质上是初始基准余额加上从第一行到当前行的Amount累积和。通过已知的Balance值反推出基准余额,再用基准余额加累积和即可得到所有行的正确Balance,全程用pandas内置的向量化函数实现,性能最优。

内容的提问来源于Stack Exchange,提问作者Goncalves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:31:23