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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:17:20