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

如何在Pandas DataFrame中按指定规则更新负值

解决DataFrame行内负值冲抵正值的问题

原始数据

Partner0 Days1-30 Days31 - 60 Days61 - 90 DaysTotal
154678200.00-50.00160.00300.00610.00
234567100.00-150.0050.00120.00120.00

处理规则

  • 查找每行中的负值
  • 获取该行当前最大正值
  • 比较负值绝对值与最大正值:
    • 若负值绝对值小于最大正值:将负值转为0,从最大正值中减去该绝对值
    • 若负值绝对值大于等于最大正值:将最大正值转为0,把该正值加到负值上,重复选取当前最大正值继续比较,直到满足上一条件后执行冲抵

目标结果

Partner0 Days1-30 Days31 - 60 Days61 - 90 DaysTotal
154678200.000.0000160.00250.00610.00
23456770.000.000050.000.0000120.00

解决方案代码

import pandas as pd

# 构造原始DataFrame
data = {
    'Partner': [154678, 234567],
    '0 Days': [200.00, 100.00],
    '1-30 Days': [-50.00, -150.00],
    '31 - 60 Days': [160.00, 50.00],
    '61 - 90 Days': [300.00, 120.00],
    'Total': [610.00, 120.00]
}
df = pd.DataFrame(data)

def process_row(row):
    # 提取需要处理的列(排除Partner和Total)
    process_cols = row.drop(['Partner', 'Total']).copy()
    
    # 循环处理直到没有负值
    while (process_cols < 0).any():
        # 获取当前负值列和数值
        neg_col = process_cols[process_cols < 0].index[0]
        neg_value = process_cols[neg_col]
        
        # 获取当前最大正值列和数值
        positive_cols = process_cols[process_cols > 0]
        if positive_cols.empty:
            break  # 无正值可冲抵,终止循环
        max_pos_col = positive_cols.idxmax()
        max_pos_value = positive_cols.max()
        
        if abs(neg_value) < max_pos_value:
            # 负值绝对值更小,直接冲抵
            process_cols[neg_col] = 0.0
            process_cols[max_pos_col] += neg_value
        else:
            # 负值绝对值更大,清空当前最大正值,更新负值
            process_cols[max_pos_col] = 0.0
            process_cols[neg_col] += max_pos_value
    
    # 将处理后的值更新回原行
    row.update(process_cols)
    return row

# 应用处理函数到每一行
processed_df = df.apply(process_row, axis=1)
# 格式化小数为4位,匹配目标格式
processed_df = processed_df.round(4)

print(processed_df)

代码说明

  1. 首先构造与问题一致的原始DataFrame
  2. 定义process_row函数逐行处理:
    • 分离出需要处理的列(排除Partner和Total,总和列无需修改)
    • 循环检测并处理负值,直到行内无负值或无正值可冲抵
    • 按照规则完成冲抵逻辑,更新对应列的数值
  3. 使用apply方法将处理函数应用到每一行,最后格式化小数显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:45:12