Pandas按两列唯一配对分组计算value列平均值,grouper是否适用
解法
你需要先把start和end的正反组合映射为同一个分组标识,再分组求均值即可,不需要用到pd.Grouper,普通groupby就能实现:
完整实现代码
import pandas as pd # 原始DataFrame df = pd.DataFrame({ 'start': {0: 365, 1: 365, 2: 365, 3: 365, 4: 356, 5: 261, 6: 240, 7: 238}, 'end': {0: 240, 1: 261, 2: 356, 3: 238, 4: 365, 5: 365, 6: 365, 7: 365}, 'value': {0: 585, 1: 567, 2: 191, 3: 186, 4: 196, 5: 545, 6: 564, 7: 184} }) # 构造统一分组键:每行的start、end按大小排序,正反组合会得到相同的分组键 df['group_min'] = df[['start', 'end']].min(axis=1) df['group_max'] = df[['start', 'end']].max(axis=1) # 分组求均值,按期望输出格式把大值设为start,小值设为end result = df.groupby(['group_min', 'group_max'], as_index=False)['value'].mean() result = result.rename(columns={'group_max': 'start', 'group_min': 'end'})[['start', 'end', 'value']] print(result)
输出结果
start end value 0 365 238 185.0 1 365 240 574.5 2 365 261 556.0 3 365 356 193.5
完全匹配你给出的预期输出。
关于pd.Grouper的说明
pd.Grouper主要用于时间维度的分组聚合(比如按周/月分组)、或者指定分组的轴、级别等参数,你这个场景属于自定义规则的普通分组,不需要使用pd.Grouper,直接传入分组列给groupby即可,逻辑更简洁。
内容的提问来源于stack exchange,提问作者Jio
相关产品推荐
相关产品推荐

