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

Pandas按条件去重:保留cid最大值行且不丢失数据列

解决Pandas保留cid最大行且不丢失其他列的问题

嘿,我懂你的困扰!你用groupby+max()的方式只拿到了cid的最大值,却把fx、fy、fz这些关键列弄丢了,对吧?这是因为你只提取了max()后的cid列,而且单纯的max()会对每一列单独取最大值,并不是保留cid最大的那一行的完整数据。

给你两个简单有效的解决方案:

方法一:先排序再去重

这个思路很直观:先按case_id、elm_id分组,再按cid降序排列,这样每个组里cid最大的行排在最前面,之后删除重复的case_id+elm_id组合,只保留第一行就行:

import pandas as pd

# 你的原始数据
df = pd.DataFrame({ 
    'case_id': [1050, 1050, 1050, 1050, 1051, 1051, 1051, 1051], 
    'elm_id': [101, 102, 101, 102, 101, 102, 101, 102], 
    'cid': [1, 1, 2, 2, 1, 1, 2, 2], 
    'fx': [736.1, 16.5, 98.8, 158.5, 272.5, 750.0, 333.4, 104.2], 
    'fy': [992.0, 261.3, 798.3, 452.0, 535.9, 838.8, 526.7, 119.4], 
    'fz': [428.4, 611.0, 948.3, 523.9, 880.9, 340.3, 890.7, 422.1]
})

# 按case_id、elm_id升序,cid降序排序
df_sorted = df.sort_values(['case_id', 'elm_id', 'cid'], ascending=[True, True, False])
# 删除重复的case_id+elm_id组合,保留第一行(cid最大的行)
df_result = df_sorted.drop_duplicates(['case_id', 'elm_id'], keep='first').reset_index(drop=True)

print(df_result)

方法二:用idxmax()定位目标行

idxmax()会返回每个组中cid最大值对应的行索引,然后用loc提取这些索引对应的完整行,这样就能完美保留所有列的数据:

# 找到每个(case_id, elm_id)组中cid最大的行的索引
max_cid_indices = df.groupby(['case_id', 'elm_id'])['cid'].idxmax()
# 根据索引提取完整行
df_result = df.loc[max_cid_indices].reset_index(drop=True)

print(df_result)

两种方法运行后都会得到你想要的结果:

case_id  cid  elm_id     fx     fy     fz
0     1050    2     101   98.8  798.3  948.3
1     1050    2     102  158.5  452.0  523.9
2     1051    2     101  333.4  526.7  890.7
3     1051    2     102  104.2  119.4  422.1

内容的提问来源于stack exchange,提问作者twegner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:25:25