使用Pandas Groupby分组后获取最大值对应project_id的问题
解决Pandas分组后获取最大值对应ID的问题
我来帮你搞定这个分组聚合的需求!你需要按time_stamp分组后,拿到三个关键信息:value_1的最大值、value_2的平均值,以及对应value_1最大值的project_id,下面是具体的实现步骤和代码示例:
核心思路
先通过分组聚合得到每组的最大值和平均值,再将原始数据与聚合结果关联,筛选出符合最大值条件的行,从而匹配到对应的project_id。
代码实现
假设你的原始数据DataFrame名为df,结构类似这样:
| time_stamp | project_id | value_1 | value_2 |
|---|---|---|---|
| 2023-01-01 | A | 10 | 5 |
| 2023-01-01 | B | 15 | 7 |
| 2023-01-02 | C | 20 | 3 |
| 2023-01-02 | D | 18 | 4 |
步骤1:分组计算基础聚合值
先算出每组的value_1最大值和value_2平均值:
import pandas as pd # 分组聚合,得到max和mean结果 aggregated = df.groupby('time_stamp').agg( max_value_1=('value_1', 'max'), avg_value_2=('value_2', 'mean') ).reset_index()
步骤2:匹配最大值对应的project_id
将原始数据和聚合结果合并,筛选出value_1等于分组最大值的行,提取需要的列:
# 合并数据并筛选符合条件的行 result = df.merge(aggregated, on='time_stamp') \ .query('value_1 == max_value_1') \ [['time_stamp', 'max_value_1', 'avg_value_2', 'project_id']]
处理多ID对应同一最大值的情况
如果同一time_stamp下有多个project_id对应相同的value_1最大值,可以把这些ID合并(比如用逗号分隔):
result = df.merge(aggregated, on='time_stamp') \ .query('value_1 == max_value_1') \ .groupby('time_stamp') \ .agg( max_value_1=('max_value_1', 'first'), avg_value_2=('avg_value_2', 'first'), project_id=('project_id', ', '.join) ).reset_index()
最终输出效果
运行后你会得到符合预期的结果:
| time_stamp | max_value_1 | avg_value_2 | project_id |
|---|---|---|---|
| 2023-01-01 | 15 | 6.0 | B |
| 2023-01-02 | 20 | 3.5 | C |
如果你的time_stamp是带时分秒的datetime类型,需要按日期分组的话,记得先处理日期格式:
df['time_stamp'] = pd.to_datetime(df['time_stamp']).dt.date
内容的提问来源于stack exchange,提问作者user9322651
相关产品推荐
相关产品推荐

