如何不使用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
相关产品推荐
相关产品推荐

