Pandas按作者分组合并两类统计结果 实现开发者贡献多维度指标汇总
你原来的第二部分统计逻辑存在问题:统计最高产时段、最高产日时没有按author维度分组,得到的是整个仓库的全局指标,并不是每个作者自己的对应指标。要实现合并需求,需要先按作者维度计算每个作者的最高产日、最高产时段,再和第一部分的统计结果按author字段合并即可。
完整实现代码
import pandas as pd # 1. 统一筛选时间范围,避免重复写逻辑 after = pd.to_datetime("2020-12-28", utc=True) before = pd.to_datetime("2021-04-10", utc=True) df = self.df[(self.df["date"] > after) & (self.df["date"] < before)].copy() # 2. 提前生成需要的衍生字段 # 最高产日:周几,0对应周一、6对应周日,和你原有逻辑一致 df['weekday'] = df['date'].dt.weekday # 最高产时段:格式化后的12小时制时间 df['time_str'] = pd.to_datetime(df['timestamp']).dt.strftime("%I:%M %p") # 3. 统计第一部分指标:总提交数、平均代码量、平均工作负载 base_stats = df.groupby('author').agg( sha=('sha', 'size'), # 和你原有输出的字段名保持一致,用sha存总提交数 code_volume=('code_volume', 'mean'), code_work_load=('code_work_load', 'mean') ).reset_index() # 4. 统计每个作者的最高产日 # 先按作者+周几分组统计提交数 day_count = df.groupby(['author', 'weekday'], as_index=False)['sha'].nunique() # 每个作者取提交数最多的周几,有并列的话默认保留第一个 most_prod_day = day_count.sort_values(['author', 'sha'], ascending=[True, False])\ .drop_duplicates('author', keep='first')\ .rename(columns={'weekday': 'most_productive_day'})[['author', 'most_productive_day']] # 5. 统计每个作者的最高产时段 # 先按作者+时段分组统计提交数 time_count = df.groupby(['author', 'time_str'], as_index=False)['sha'].nunique() # 每个作者取提交数最多的时段,有并列的话默认保留第一个 most_prod_time = time_count.sort_values(['author', 'sha'], ascending=[True, False])\ .drop_duplicates('author', keep='first')\ .rename(columns={'time_str': 'most_productive_time'})[['author', 'most_productive_time']] # 6. 合并三个统计结果,得到最终汇总表 final_result = base_stats.merge(most_prod_day, on='author', how='left')\ .merge(most_prod_time, on='author', how='left')\ .set_index('author') # 如果你不需要把author设为索引,直接删掉这行即可 # 输出结果 print(final_result)
注意事项
- 如果同一个作者有多个最高产日/时段的提交数完全相同,上述逻辑会保留排序后的第一个结果,如果你需要保留所有并列结果,去掉
drop_duplicates相关代码自行调整即可。 - 用左连接(left join)是为了避免特殊场景下丢失第一部分已经统计到的作者,不会出现漏算情况。
内容的提问来源于stack exchange,提问作者milan
相关产品推荐
相关产品推荐

