如何基于多条件对Pandas DataFrame按cycle列删除重复行
问题描述
我现有如下结构的DataFrame:df
| cylce | csec | dist | vel |
|---|---|---|---|
| 1 | -40.1 | 9.87 | 2.7 |
| 1 | -40.1 | 9.89 | 2.2 |
| 2 | -39.1 | 14.07 | 2.0 |
| 2 | -39.1 | 14.09 | 2.8 |
| 3 | -38.7 | 18.09 | 3.2 |
| 4 | -36.6 | 15.37 | 0.5 |
| 4 | -38.01 | 16.23 | 1.8 |
| 4 | -38.4 | 16.66 | 3.1 |
需要按cycle(注:示例表头拼写为cylce,以实际列名为准)列分组删除重复行,规则如下:
- 若同组
cycle的csec取值相同:- 优先比对
dist字段,保留dist值最大的行 - 若
dist取值也相同,则比对vel字段,保留vel值最大的行
- 优先比对
- 若同组
cycle的csec取值不同:- 保留
csec值最大的行
- 保留
期望得到的输出结果如下:output
| cylce | csec | dist | vel |
|---|---|---|---|
| 1 | -40.1 | 9.89 | 2.2 |
| 2 | -39.1 | 14.09 | 2.8 |
| 3 | -38.7 | 18.09 | 3.2 |
| 4 | -36.6 | 15.37 | 0.5 |
目前已通过如下代码获取到存在cycle重复的行:
duplicate_cyle = df[df.duplicated('cycle',keep = False)]
需要实现符合上述自定义规则的去重操作。
实现方案
去重规则本质是字段优先级排序:csec优先级最高,其次是dist,最后是vel,高优先级字段取最大值即可,不需要单独拆分重复行处理,直接排序后去重就能得到结果,代码如下:
# 按规则优先级降序排序:同cycle内先按csec降序,再按dist降序,最后按vel降序 # 注意如果你的列名实际是表头的cylce,把下面的'cycle'替换成'cylce' df = df.sort_values( by=['cycle', 'csec', 'dist', 'vel'], ascending=[True, False, False, False], ignore_index=True ) # 每个cycle分组保留排序后的第一行,就是符合规则的行 result = df.drop_duplicates(subset='cycle', keep='first')
运行后result的输出和给出的期望结果完全一致。
如果确实需要基于已经提取的duplicate_cyle做处理,逻辑完全相同:对重复组按上述规则排序取首行,再和无重复的行拼接即可,但是步骤更繁琐,没有必要。
内容的提问来源于stack exchange,提问作者Mageo
相关产品推荐
相关产品推荐

