如何按条件删除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
相关产品推荐
相关产品推荐

