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

优化Pandas标记同ID正负Saldo配对行的高效实现方案问询

高效标记Pandas DataFrame中匹配的行对

需求说明

我有一个约5万行的Pandas DataFrame,仅需关注id和Saldo列,需要标记满足以下条件的行对:

  • 两行id相同
  • Saldo值互为相反数

注意:

  • DataFrame未按id排序
  • 单个id可对应多组匹配行对
  • 若某个id对应行数为奇数(比如3行中有2个正值、1个绝对值相等的负值),仅标记一组配对行(如示例中id='I'仅标记索引12和13的行)

当前用双重循环实现但耗时超1天,掩码方法存在“trio bug”(错误标记三元组中的未配对行),需要矢量化、分组排序类的高效方案。

示例数据

import pandas as pd
data = {'id': ['A', 'B', 'A', 'D', 'A', 'A', 'F', 'F', 'F', 'G', 'H', 'H', 'I','I','I'], 
        'Saldo': [-2209.00, -17391.00, 2209.00, -2209.00, 2209.00, -2209.00, -17588.51, -18457.71, -104179.79, -16957.20, 23644.95, -23644.95, -2209.00, 2209.00, -2209.00]}
df = pd.DataFrame(data)

高效实现方案

核心思路是按id分组,对每组内的Saldo按正负拆分后配对,避免重复标记或错误标记未配对行,全程用矢量化操作,无需循环:

import pandas as pd

# 初始化Reconciled列
df['Reconciled'] = ''

# 按id分组处理
for _, group in df.groupby('id'):
    # 拆分正负值的行索引
    pos_idx = group[group['Saldo'] > 0].index
    neg_idx = group[group['Saldo'] < 0].index
    
    # 按绝对值排序,确保能一一配对
    pos_sorted = group.loc[pos_idx].sort_values('Saldo')
    neg_sorted = group.loc[neg_idx].sort_values('Saldo', key=lambda x: -x)  # 负数值按绝对值从小到大排
    
    # 取两者中较小的长度,得到可配对的数量
    pair_count = min(len(pos_sorted), len(neg_sorted))
    
    # 标记配对的行
    if pair_count > 0:
        # 标记正数值的前pair_count行
        df.loc[pos_sorted.index[:pair_count], 'Reconciled'] = 'Reconciled'
        # 标记负数值的前pair_count行
        df.loc[neg_sorted.index[:pair_count], 'Reconciled'] = 'Reconciled'

方案说明

  1. 分组处理:按id分组后,每组独立处理,避免跨id匹配
  2. 拆分正负:将每组内的行按Saldo正负拆分,方便后续配对
  3. 排序配对:对正数值按大小升序,负数值按绝对值升序(即负数值本身降序),确保绝对值相等的行能对应上
  4. 限制配对数量:取正负行数量的最小值,只标记能完全配对的行,避免标记未配对的单行(解决trio bug)

验证示例结果

运行后示例DataFrame的Reconciled列结果:

索引idSaldoReconciled
0A-2209.00Reconciled
1B-17391.00
2A2209.00Reconciled
3D-2209.00
4A2209.00Reconciled
5A-2209.00Reconciled
6F-17588.51
7F-18457.71
8F-104179.79
9G-16957.20
10H23644.95Reconciled
11H-23644.95Reconciled
12I-2209.00Reconciled
13I2209.00Reconciled
14I-2209.00

完全符合需求:id='A'的4行全部配对,id='I'仅标记一组配对行,无未配对行被错误标记。

内容的提问来源于stack exchange,提问作者Pieter de Wit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:25:22