看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
分组统计指定列前缀的最大值(如 start_*
和 end_*
)是一种常见的数据聚合需求,其核心背景通常涉及时间区间合并、状态分段统计或资源占用分析。例如,在设备运行监控中,设备可能分多次启停(start_1/end_1、start_2/end_2),需统计其总运行区间时,需取所有 start_*
的最小值作为全局起点,取所有 end_*
的最大值作为全局终点;在项目管理中,若任务分多阶段进行,需合并各阶段时间线以计算整体周期。此外,此类操作也适用于金融交易(合并多笔交易时段)、用户行为分析(连续活跃时段)或工业传感器数据处理(设备多段运行状态聚合)。通过按列前缀分组统计极值,可高效压缩冗余数据,提取关键时间跨度或状态边界,为后续的趋势分析、资源调度或异常检测提供结构化输入。
我们构造数据如下:
import pandas as pd
import io
data = '''
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 600 1000 DEF
'''
df = pd.read_csv(io.StringIO(data), sep=r'\s+')
df
# ...
按照 name 列分组,然后取 start_*
和 end_*
的所有列中的最大值,最终结果是:
'''
name start end
0 ABC 300 400
1 DEF 600 1000
'''
核心思路是 按 'name' 分组后,对每组数据分别计算所有以 'start_' 开头的列的整体最大值,以及所有以 'end_' 开头的列的整体最大值。
具体来说:
name
列分组,每组包含相同 name
的所有行。filter(like='start_')
筛选出所有 start_
前缀的列,并计算这些列所有值的最大值(axis=None
表示跨所有行列计算)。end_
前缀的列。start
和 end
,表示每组中对应前缀列的最大值。最终代码如下:
(
df.groupby('name', as_index=False)
.apply(
lambda d: pd.Series({
'start': d.filter(like='start_').max(axis=None),
'end': d.filter(like='end_').max(axis=None)
}),include_groups=False
)
)
'''
name start end
0 ABC 300 400
1 DEF 600 1000
'''
这样就完成了最终的需求。
(完)
更新时间:2025-07-09 20:08:40 标签:python pandas 分组 最大值