Python:如何用DataFrame与字典计算业务流程分支总工时
计算各分支交易类型总工时的实现方案
先完成数据导入步骤,用Pandas结合openpyxl读取Excel并转为DataFrame:
import pandas as pd # 读取业务流程交易表 transactions_df = pd.read_excel('业务流程交易表.xlsx', engine='openpyxl') # 读取交易时长表 duration_df = pd.read_excel('交易时长表.xlsx', engine='openpyxl')
以下是你提到的三种实现方式,按效率从高到低排序:
1. 交易时长表转字典映射(推荐)
把交易时长表转为{Transaction Type: time in S}的字典,通过字典快速匹配交易类型对应的时长,再与发生次数相乘,这是效率最高的方法,适合大数据量:
# 构建交易类型到时长的字典 duration_dict = duration_df.set_index('Transaction Type')['time in S'].to_dict() # 新增总工时列:匹配字典中的时长 × 发生次数 transactions_df['Effort in S'] = transactions_df['Transaction Type'].map(duration_dict) * transactions_df['occurrences']
2. Lambda函数结合apply
用apply配合lambda函数逐行匹配交易类型对应的时长,逻辑直观但效率低于字典映射,适合小数据集:
# 先把时长表转为方便查询的结构 duration_map = duration_df.set_index('Transaction Type')['time in S'] # 用apply+lambda计算总工时 transactions_df['Effort in S'] = transactions_df.apply( lambda row: row['occurrences'] * duration_map.get(row['Transaction Type'], 0), # 0为缺失交易类型的默认值 axis=1 )
3. 遍历DataFrame(不推荐)
用iterrows或itertuples遍历每一行计算,代码繁琐且效率极低,仅适合理解基础逻辑:
# 先构建时长字典 duration_dict = duration_df.set_index('Transaction Type')['time in S'].to_dict() # 初始化总工时列 transactions_df['Effort in S'] = 0 # 遍历每一行计算 for idx, row in transactions_df.iterrows(): trans_type = row['Transaction Type'] if trans_type in duration_dict: transactions_df.at[idx, 'Effort in S'] = row['occurrences'] * duration_dict[trans_type]
按分支统计各交易类型总工时
完成总工时计算后,用groupby分组统计即可:
# 按分支和交易类型分组,求和总工时 branch_effort_summary = transactions_df.groupby(['branch', 'Transaction Type'])['Effort in S'].sum().reset_index() # 查看结果 print(branch_effort_summary)
注意事项
- 如果交易时长表中存在业务表没有的交易类型,不影响计算;如果业务表有不在时长表的交易类型,可根据需求设置默认值(比如上述lambda方法中的0)。
- 优先使用字典映射的方法,Pandas的向量化操作比遍历高效得多。
内容的提问来源于stack exchange,提问作者hugo999
相关产品推荐
相关产品推荐

