You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于多条件对Pandas DataFrame按cycle列删除重复行

问题描述

我现有如下结构的DataFrame:
df

cylcecsecdistvel
1-40.19.872.7
1-40.19.892.2
2-39.114.072.0
2-39.114.092.8
3-38.718.093.2
4-36.615.370.5
4-38.0116.231.8
4-38.416.663.1

需要按cycle(注:示例表头拼写为cylce,以实际列名为准)列分组删除重复行,规则如下:

  • 若同组cycle的csec取值相同:
    • 优先比对dist字段,保留dist值最大的行
    • 若dist取值也相同,则比对vel字段,保留vel值最大的行
  • 若同组cycle的csec取值不同:
    • 保留csec值最大的行

期望得到的输出结果如下:
output

cylcecsecdistvel
1-40.19.892.2
2-39.114.092.8
3-38.718.093.2
4-36.615.370.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 01:21:34