如何根据另一列值统计DataFrame数据?含参训统计需求
Pandas 统计方案(无需预先过滤未参训行)
需求1:统计全员参训次数及Smith单独参训场次
1. 全员参训次数统计
通过分组后对参训状态做条件计数,无需提前过滤未参训行:
import pandas as pd import numpy as np # 假设原DataFrame名为df,列名分别为「员工姓名」、「参与状态」 participation_stats = df.groupby('员工姓名')['参与状态'].agg( 参训次数=lambda group: np.sum(group == 'participated') ).reset_index()
该代码会生成新的DataFrame,包含每位员工的姓名和对应的参训次数。
2. Smith的参训场次单独统计
可以直接从上述统计结果提取,或直接从原DataFrame计算:
# 方式1:从统计结果提取 smith_count = participation_stats.loc[participation_stats['员工姓名'] == 'Smith', '参训次数'].iloc[0] # 方式2:直接从原DataFrame计算(无需过滤行) smith_count = np.sum((df['员工姓名'] == 'Smith') & (df['参与状态'] == 'participated'))
需求2:统计参训课程总时长
先确保已新增「Duration」列(填充课程分钟数),然后通过分组条件求和,未参训行的时长会被置为0,无需预先过滤:
# 方式1:使用np.where处理未参训行 duration_stats = df.groupby('员工姓名').agg( 参训总时长=lambda group: np.sum(np.where(group['参与状态'] == 'participated', group['Duration'], 0)) ).reset_index() # 方式2:分组内条件筛选求和 duration_stats = df.groupby('员工姓名').apply( lambda group: group[group['参与状态'] == 'participated']['Duration'].sum() ).reset_index(name='参训总时长')
两种方式都不会预先过滤未参训的行,最终结果仅统计参训课程的总时长。
内容的提问来源于stack exchange,提问作者Isegrimm
相关产品推荐
相关产品推荐

