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

按Name分组提取多列(start_1、end_1等)的MIN与MAX值

按Name分组提取多列全局最小/最大值的Pandas实现

需求

按name列对数据分组,从start_1、end_1、start_2、end_2四列的所有值中,提取最小值作为start字段,最大值作为end字段。

原始数据

start_1  end_1  start_2  end_2  name
 100      200    300      400    ABC
 100      200    300      400    ABC
 150      250    300      400    ABC
 300      200    300      900    DEF
 50       200    300      1000   DEF

期望输出

start  end  name
 100   400  ABC
 50    1000 DEF

解决方案

方法一:分组后自定义聚合函数

直接对分组后的子DataFrame,提取目标四列并计算全局最小/最大值:

import pandas as pd

# 构造原始数据
data = {
    'start_1': [100, 100, 150, 300, 50],
    'end_1': [200, 200, 250, 200, 200],
    'start_2': [300, 300, 300, 300, 300],
    'end_2': [400, 400, 400, 900, 1000],
    'name': ['ABC', 'ABC', 'ABC', 'DEF', 'DEF']
}
df = pd.DataFrame(data)

# 分组聚合
result = df.groupby('name').agg(
    start=lambda x: x[['start_1', 'end_1', 'start_2', 'end_2']].values.min(),
    end=lambda x: x[['start_1', 'end_1', 'start_2', 'end_2']].values.max()
).reset_index()[['start', 'end', 'name']]

print(result)

方法二:转长格式后分组计算

先将多列数值字段转成单列,再分组求最小/最大值,逻辑更直观:

import pandas as pd

data = {
    'start_1': [100, 100, 150, 300, 50],
    'end_1': [200, 200, 250, 200, 200],
    'start_2': [300, 300, 300, 300, 300],
    'end_2': [400, 400, 400, 900, 1000],
    'name': ['ABC', 'ABC', 'ABC', 'DEF', 'DEF']
}
df = pd.DataFrame(data)

# 转长格式,合并数值列
melted_df = df.melt(id_vars='name', value_vars=['start_1', 'end_1', 'start_2', 'end_2'])

# 分组计算最小/最大值
result = melted_df.groupby('name').agg(
    start=('value', 'min'),
    end=('value', 'max')
).reset_index()[['start', 'end', 'name']]

print(result)

两种方法均可得到与期望一致的输出。

参考思路

参考了Stack Overflow社区中关于Pandas分组聚合、多列min/max计算的相关讨论,核心是利用groupby结合聚合函数实现需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:42:35