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

基于ID消除数据及其相反数的DataFrame处理需求

解决方案

首先构造示例DataFrame:

import pandas as pd

df = pd.DataFrame({
    'neto': [356, -356, -175, 700, -700, 250, -36, -36, -36],
    'damo': ['008', '008', '009', '009', '009', '009', '018', '018', '018']
})

使用以下代码实现按damo分组抵消相反数对,剩余值按规则保留/求和:

def process_group(group):
    # 统计组内每个neto值的出现次数
    count = group['neto'].value_counts().to_dict()
    
    # 抵消互为相反数的数值对
    for num in list(count.keys()):
        if count[num] == 0:
            continue
        opposite = -num
        if opposite in count and count[opposite] > 0:
            min_count = min(count[num], count[opposite])
            count[num] -= min_count
            count[opposite] -= min_count
    
    # 生成结果:单个值直接保留,多个相同值求和合并
    result_rows = []
    damo_id = group['damo'].iloc[0]
    for num, cnt in count.items():
        if cnt <= 0:
            continue
        if cnt == 1:
            result_rows.append({'neto': num, 'damo': damo_id})
        else:
            result_rows.append({'neto': num * cnt, 'damo': damo_id})
    
    return pd.DataFrame(result_rows)

# 分组处理并整理结果
final_df = df.groupby('damo', group_keys=False).apply(process_group).reset_index(drop=True)

运行后得到的结果:

netodamo
-175009
250009
-108018

逻辑说明

  1. 分组统计:按damo分组后,统计每个neto值的出现次数;
  2. 抵消相反数对:遍历每个数值,若存在对应的相反数,则按最小出现次数抵消成对的数值;
  3. 生成结果:剩余的数值中,单个值直接保留,多个相同数值求和合并为一行,完全抵消的分组(如008)则被过滤。

内容的提问来源于stack exchange,提问作者Belky Xiomara Mayorga Ardila

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:05:31