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

