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
相关产品推荐
相关产品推荐

