如何在Pandas DataFrame中按指定规则更新负值
解决DataFrame行内负值冲抵正值的问题
原始数据
| Partner | 0 Days | 1-30 Days | 31 - 60 Days | 61 - 90 Days | Total |
|---|---|---|---|---|---|
| 154678 | 200.00 | -50.00 | 160.00 | 300.00 | 610.00 |
| 234567 | 100.00 | -150.00 | 50.00 | 120.00 | 120.00 |
处理规则
- 查找每行中的负值
- 获取该行当前最大正值
- 比较负值绝对值与最大正值:
- 若负值绝对值小于最大正值:将负值转为0,从最大正值中减去该绝对值
- 若负值绝对值大于等于最大正值:将最大正值转为0,把该正值加到负值上,重复选取当前最大正值继续比较,直到满足上一条件后执行冲抵
目标结果
| Partner | 0 Days | 1-30 Days | 31 - 60 Days | 61 - 90 Days | Total |
|---|---|---|---|---|---|
| 154678 | 200.00 | 0.0000 | 160.00 | 250.00 | 610.00 |
| 234567 | 70.00 | 0.0000 | 50.00 | 0.0000 | 120.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)
代码说明
- 首先构造与问题一致的原始DataFrame
- 定义
process_row函数逐行处理:- 分离出需要处理的列(排除Partner和Total,总和列无需修改)
- 循环检测并处理负值,直到行内无负值或无正值可冲抵
- 按照规则完成冲抵逻辑,更新对应列的数值
- 使用
apply方法将处理函数应用到每一行,最后格式化小数显示
内容的提问来源于stack exchange,提问作者Hanaa Majzoub
相关产品推荐
相关产品推荐

