在Pandas中按多条件去重:按Field1聚合取Field2最大值与Field3最小值
解决方案:按Field1分组聚合,批量处理多字段
嘿,这个需求我熟!你需要按Field1分组,每组保留一行,同时对Field2取最大值、Field3取最小值,其他字段因为每组内值都相同,直接保留就行——而且字段超100个,肯定不能手动列每个字段的聚合规则对吧?下面分两种场景给你代码:
场景1:不需要保留原ID,只需要聚合后的值
这种情况用groupby+字典推导式批量设置聚合规则最方便,不用手动写几百个字段:
import pandas as pd # 构造你的示例DataFrame data = { 'ID': [1,2,3,4], 'Field1': ['A','A','B','B'], 'Field2': [1,0,2,3], 'Field3': [6,1,4,8], 'Field4': ['F','F','F','F'] } df = pd.DataFrame(data) # 1. 先给所有字段默认设置聚合规则为'first'(因为每组内这些字段值都相同) agg_rules = {col: 'first' for col in df.columns} # 2. 单独修改需要特殊处理的字段 agg_rules['Field2'] = 'max' agg_rules['Field3'] = 'min' # 3. 分组聚合,as_index=False让Field1不变成索引 result_df = df.groupby('Field1', as_index=False).agg(agg_rules) print(result_df)
输出结果:
Field1 ID Field2 Field3 Field4 0 A 1 1 1 F 1 B 3 3 4 F
场景2:需要保留原ID(比如你示例中取Field2最大+Field3最小的那行的ID)
如果要和你给出的期望结果完全一致(保留ID=1和4),需要找到每组内同时满足Field2最大且Field3最小的行,再提取出来:
# 分组找到每组内符合条件的行的索引 target_indices = df.groupby('Field1').apply( lambda x: x[(x['Field2'] == x['Field2'].max()) & (x['Field3'] == x['Field3'].min())].index[0] ).values # 根据索引提取目标行 result_df_keep_id = df.loc[target_indices] print(result_df_keep_id)
输出结果和你期望的完全一致:
ID Field1 Field2 Field3 Field4 0 1 A 1 1 F 3 4 B 3 4 F
补充说明
- 对于超过100个字段的情况,第一种方法的字典推导式
{col: 'first' for col in df.columns}会自动遍历所有字段,完全不用手动写每个字段的规则,非常高效。 - 如果某些非特殊字段在组内可能有不同值(你需求里说其余字段都相同,所以不用考虑),可以根据实际情况调整聚合规则,比如用
median或last等。
内容的提问来源于stack exchange,提问作者babz
相关产品推荐
相关产品推荐

