如何在Pandas中合并因长描述拆分的账户账单DataFrame行?
解决方法
不用逐行迭代,完全可以用Pandas的向量化操作搞定,核心是先给需要合并的行打上同一个分组标签,再按组聚合处理:
步骤1:准备示例数据
先把你给出的示例转成DataFrame:
import pandas as pd import numpy as np data = { 'Description': ['e-Transfer - Autodeposit', ' AF6hdfUdV', 'Credit Card Payment'], 'Withdrawals': ['', '', '46.78'], 'Deposits': ['', '17.45', ''] } df = pd.DataFrame(data) # 把空字符串转成NaN,方便后续判断 df = df.replace('', np.nan)
步骤2:生成分组标识
判断每行是否是完整记录行(即Withdrawals或Deposits有值),然后用cumsum()生成分组ID,再向前填充,让拆分的两行归为同一组:
# 标记完整记录行(有金额的行) df['is_complete'] = df[['Withdrawals', 'Deposits']].notna().any(axis=1) # 生成分组ID,完整行作为新组的起点 df['group_id'] = df['is_complete'].cumsum() # 向前填充分组ID,让上一行拆分的描述行和当前完整行同组 df['group_id'] = df['group_id'].ffill()
步骤3:按组聚合合并
对每个分组,合并Description列,同时提取Withdrawals和Deposits的非空值:
merged_df = df.groupby('group_id').agg( Description=('Description', lambda x: ' '.join(x.str.strip())), Withdrawals=('Withdrawals', lambda x: x.dropna().iloc[0] if not x.dropna().empty else np.nan), Deposits=('Deposits', lambda x: x.dropna().iloc[0] if not x.dropna().empty else np.nan) ).reset_index(drop=True)
最终结果
运行后merged_df就是合并好的DataFrame:
| Description | Withdrawals | Deposits |
|---|---|---|
| e-Transfer - Autodeposit AF6hdfUdV | NaN | 17.45 |
| Credit Card Payment | 46.78 | NaN |
关键逻辑说明
- 利用
cumsum()生成分组:完整记录行(有金额)会触发分组ID递增,拆分的描述行因为没有金额,会继承下一行的分组ID(通过ffill()) - 聚合时用
str.strip()去掉描述文本的多余空格,再拼接成完整描述 - 金额列取分组内的非空值,保证每个分组只保留有效金额
内容的提问来源于stack exchange,提问作者bronislav
相关产品推荐
相关产品推荐

