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

如何在Pandas DataFrame中移除退款(Chargebacks)及其对应正向记录?

移除Pandas DataFrame中退款及对应正向记录的方法

我有一个存储会计数据的Pandas DataFrame,不同数据分组里存在负值(也就是退款Chargebacks),需要把这些负值记录和它们对应的正向记录一起从DataFrame里删掉。

示例原始数据

import pandas as pd

df = pd.DataFrame({
    "ID": [1,2,3,3,3,4,5,5], 
    "Date": [44958,44958,44959,44959,44959,44959,44988,44988],
    "Amount": [39.99,24.15,15.5,-15.5,15.5,8.99,12.99,-12.99], 
    "Type" : ["Sale","Sale","Sale","Sale","Sale","Sale","Sale","Sale"],
    "Product": ["Pencil","Pencil","Book","Book","Book","Ruler","Pen","Pen"],
    "Tax": [2.7993,1.6905,1.085,-1.085,1.085,0.6293,0.9093,-0.9093],
    "Fee": [0.03999,0.02415,0.0155,-0.0155,0.0155,0.00899,0.01299,-0.01299]
})

期望处理后结果

ID  Date  Amount  Type Product     Tax      Fee
0   1  44958   39.99  Sale  Pencil  2.7993  0.03999
1   2  44958   24.15  Sale  Pencil  1.6905  0.02415
2   3  44959   15.50  Sale    Book  1.0850  0.01550
3   4  44959    8.99  Sale   Ruler  0.6293  0.00899

解决方法

核心逻辑是:同一笔交易的正向记录和退款记录会共享相同的ID、Date、Product,且金额绝对值一致。我们可以按这些字段分组统计数量,偶数条的分组说明正负刚好抵消(要全删),奇数条的分组说明剩一条未被抵消的正向记录(要保留)。

直接用groupby + transform就能快速实现:

# 按标识字段和金额绝对值分组,计算每组记录数
df['record_count'] = df.groupby(['ID', 'Date', 'Product', df['Amount'].abs()])['Amount'].transform('count')
# 筛选出记录数为奇数的行,删除临时列并重置索引
result = df[df['record_count'] % 2 != 0].drop('record_count', axis=1).reset_index(drop=True)

运行这段代码后,就能得到和期望一致的结果。

内容的提问来源于stack exchange,提问作者hyperinfer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:02:40