如何用Lambda函数按条件计算员工参与销售金额总和并更新DataFrame
解决方案
你原来用apply逐行处理的方式在数据量大时效率极低,且语法易出错。推荐先将销售记录按参与员工拆分行,再分组求和后合并到员工每日列表中,这种方法更高效且易维护。
步骤1:展开销售记录的参与员工列
用explode把EEs_Present中的每个员工ID拆成单独行,让每条销售记录对应每个参与员工:
# 展开EEs_Present列,每个员工ID对应一条销售记录 exploded_sales = all_sales_df.explode('EEs_Present').rename(columns={'EEs_Present': 'EE_ID'}) # 确保EE_ID类型与daily_employee_df一致(统一为整数类型) exploded_sales['EE_ID'] = exploded_sales['EE_ID'].astype(int)
步骤2:按日期和员工分组计算销售总额
# 分组求和,得到每位员工每日的销售总额 ee_daily_sales = exploded_sales.groupby(['Date', 'EE_ID'])['Sale_Amt'].sum().reset_index()
步骤3:合并到daily_employee_df中
用merge将计算好的总额合并到原员工表,未参与销售的员工总额填0:
daily_employee_df = daily_employee_df.merge( ee_daily_sales, on=['Date', 'EE_ID'], how='left' ).fillna({'Sale_Amt': 0.0}) # 重命名列名更清晰 daily_employee_df = daily_employee_df.rename(columns={'Sale_Amt': 'Daily_Total_Sales'})
原方法报错原因及低效写法(不推荐)
你之前的求和尝试语法错误,大概率是因为布尔索引后未正确提取Sale_Amt再求和。即便修正语法,这种逐行遍历的方式在数千条销售记录时会重复大量筛选操作,效率极低:
# 仅作语法参考,数据量大时不建议使用 daily_employee_df['Daily_Total_Sales'] = daily_employee_df.apply( lambda x: all_sales_df[ (all_sales_df['Date'] == x['Date']) & (all_sales_df['EEs_Present'].apply(lambda c: x['EE_ID'] in c)) ]['Sale_Amt'].sum(), axis=1 )
内容的提问来源于stack exchange,提问作者Not Dave
相关产品推荐
相关产品推荐

