如何按特定条件去除Pandas DataFrame重复行并保留diast最大值行
解决Pandas DataFrame按连续组保留diast最大值行的问题
需求说明
对DataFrame进行处理:将连续的a、b、c、d列值相同的行视为一组,保留每组中diast列数值最大的行(示例中每组diast呈递增状态,若实际数据无序需先按diast排序)。
示例数据构造
import pandas as pd data = { 'age': [29]*12, 'syst': [90]*12, 'diast': [57,58,59,60,61,62,63,64,65,66,67,68], 'a': ['MO','MO','MO','MO','0','0','0','0','MO','MO','MO','MO'], 'b': ['MO','MO','MO','MO','0','0','0','0','MO','MO','MO','MO'], 'c': ['0','0','0','0','0','0','0','0','0','0','0','0'], 'd': ['MO','MO','MO','MO','0','0','0','0','MO','MO','MO','MO'] } df = pd.DataFrame(data)
实现方法
步骤1:标记连续分组
通过对比当前行与上一行的a/b/c/d列是否存在差异,生成连续分组的唯一标识:
# 生成连续分组的ID df['group_id'] = df[['a','b','c','d']].ne(df[['a','b','c','d']].shift()).any(axis=1).cumsum()
步骤2:按分组保留diast最大值行
方法一:通用方案(适用于diast无序的场景)
# 获取每组diast最大值对应的行索引 max_idx = df.groupby('group_id')['diast'].idxmax() # 提取目标结果并移除临时分组列 result = df.loc[max_idx].drop(columns='group_id')
方法二:优化方案(仅适用于diast递增的场景,效率更高)
# 直接取每组最后一行(即diast最大值行) result = df.groupby('group_id').last().reset_index(drop=True)
结果展示
执行后得到的目标结果如下:
| age | syst | diast | a | b | c | d |
|---|---|---|---|---|---|---|
| 29 | 90 | 60 | MO | MO | 0 | MO |
| 29 | 90 | 64 | 0 | 0 | 0 | 0 |
| 29 | 90 | 68 | MO | MO | 0 | MO |
内容的提问来源于stack exchange,提问作者Akib
相关产品推荐
相关产品推荐

