基于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)
运行后得到的结果:
| neto | damo |
|---|---|
| -175 | 009 |
| 250 | 009 |
| -108 | 018 |
逻辑说明
- 分组统计:按
damo分组后,统计每个neto值的出现次数; - 抵消相反数对:遍历每个数值,若存在对应的相反数,则按最小出现次数抵消成对的数值;
- 生成结果:剩余的数值中,单个值直接保留,多个相同数值求和合并为一行,完全抵消的分组(如
008)则被过滤。
内容的提问来源于stack exchange,提问作者Belky Xiomara Mayorga Ardila
相关产品推荐
相关产品推荐

