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

如何按条件删除pandas DataFrame中存在正负数值抵消的对应行

解决方案

实现思路

  • 新增绝对值列和符号列,用于区分同组的正负数值
  • 对同分组下的正负数值分别编号,统计每组可抵消的对数(正负数量的最小值)
  • 过滤掉编号小于抵消对数的行,剩下的就是需要保留的内容

完整代码

import pandas as pd
import numpy as np

# 示例数据集
data = [[1111,'10/1/2021',21,123],
        [1111,'10/1/2021',-21,123],
        [1111,'10/1/2021',21,123],
        [2222,'10/2/2021',15,234],
        [2222,'10/2/2021',15,234],
        [3333,'10/3/2021',15,234],
        [3333,'10/3/2021',15,234]]
df = pd.DataFrame(data,columns = ['Individual','date','number','cc'])

# 新增辅助列
df['abs_num'] = df['number'].abs()
df['sign'] = np.sign(df['number'])
# 同分组下同符号的行编号
df['cnt'] = df.groupby(['Individual','date','cc','abs_num','sign']).cumcount()

# 统计每个分组正负数值的数量,计算可抵消的对数
group = df.groupby(['Individual','date','cc','abs_num'])['sign']
pos_cnt = group.transform(lambda x: (x==1).sum())
neg_cnt = group.transform(lambda x: (x==-1).sum())
offset = np.minimum(pos_cnt, neg_cnt)

# 过滤保留未被抵消的行,删除辅助列
res = df[df['cnt'] >= offset].drop(columns=['abs_num','sign','cnt']).reset_index(drop=True)
print(res)

输出结果

Individual       date  number   cc
0        1111  10/1/2021      21  123
1        2222  10/2/2021      15  234
2        2222  10/2/2021      15  234
3        3333  10/3/2021      15  234
4        3333  10/3/2021      15  234

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:15:07