如何用Python pandas groupby实现职级变动耗时的三元组分析?
职级变动耗时分析实现方案
以下是用Python pandas处理该需求的具体步骤:
1. 准备工作与数据读取
首先确保安装了pandas和对应Excel读取依赖(如openpyxl处理xlsx文件),然后读取数据并做预处理:
import pandas as pd # 替换为你的Excel文件路径 df = pd.read_excel("职级数据.xlsx") # 将date转为数值类型(如果是年份格式),如果是完整日期可转成datetime后提取年份 df['date'] = pd.to_numeric(df['date']) # 把l1/l2这类职级转为数字,方便后续计算 df['rank_num'] = df['rank'].str.extract('(\d+)').astype(int)
2. 分组排序
按员工ID分组,每组内按时间升序排列,保证职级变动的顺序正确:
# 先全局按id和date排序,再分组 sorted_df = df.sort_values(by=['id', 'date']) grouped = sorted_df.groupby('id')
3. 生成职级变动三元组
遍历每个员工的记录,对比连续两条数据生成(rankA, rankB, timeDiff):
change_records = [] for _, group in grouped: # 遍历组内除最后一条外的所有记录,和下一条做对比 for idx in range(len(group) - 1): current_rank = group.iloc[idx]['rank_num'] next_rank = group.iloc[idx+1]['rank_num'] time_diff = group.iloc[idx+1]['date'] - group.iloc[idx]['date'] change_records.append( (current_rank, next_rank, time_diff) ) # 输出结果,和你期望的一致 print(change_records) # 输出: [(1, 2, 1), (2, 3, 2), (2, 3, 3)]
4. 计算不同职级变动的平均耗时
把变动记录转为DataFrame,按职级变动组合分组计算平均值:
change_df = pd.DataFrame(change_records, columns=['rankA', 'rankB', 'timeDiff']) avg_time = change_df.groupby(['rankA', 'rankB'])['timeDiff'].mean().reset_index() print(avg_time)
注意事项
- 如果你的
date是完整日期格式(如2009-05-10),可以用df['date'] = pd.to_datetime(df['date'])转换后,用df['date'].dt.year提取年份,或者直接计算日期差(结果为天数,可按需转换为年/月)。 - 如果职级格式不是
l+数字,可以用字典映射转换,比如:rank_map = {'l1':1, 'l2':2, 'l3':3}; df['rank_num'] = df['rank'].map(rank_map)。
内容的提问来源于stack exchange,提问作者Shaharg
相关产品推荐
相关产品推荐

