如何用Pandas groupby统计每日岗位人数并回写至原DataFrame?
解决Pandas按日+岗位统计并回写原DataFrame的问题
你需要统计每日各岗位的员工数量并回写到原DataFrame,核心问题在于之前的分组维度不全——只按DAY分组无法区分同日内的不同岗位。以下是两种高效实现方式:
方法一:多维度分组+transform(推荐)
直接同时按DAY和JOB_TITLE两个字段分组,再用transform('count')将统计结果广播到原DataFrame的每一行:
import pandas as pd shifts = [("Cashier", "Thursday"), ("Cashier", "Thursday"), ("Cashier", "Thursday"), ("Cook", "Thursday"), ("Cashier", "Friday"), ("Cashier", "Friday"), ("Cook", "Friday"), ("Cook", "Friday"), ("Cashier", "Saturday"), ("Cook", "Saturday"), ("Cook", "Saturday")] labels = ["JOB_TITLE", "DAY"] df = pd.DataFrame.from_records(shifts, columns=labels) # 关键:同时按DAY和JOB_TITLE分组,统计每组的数量并回写 df['TYPE'] = df.groupby(['DAY', 'JOB_TITLE'])['JOB_TITLE'].transform('count') print(df)
执行后会得到你期望的结果:
JOB_TITLE DAY TYPE 0 Cashier Thursday 3 1 Cashier Thursday 3 2 Cashier Thursday 3 3 Cook Thursday 1 4 Cashier Friday 2 5 Cashier Friday 2 6 Cook Friday 2 7 Cook Friday 2 8 Cashier Saturday 1 9 Cook Saturday 2 10 Cook Saturday 2
方法二:value_counts+merge
如果习惯用value_counts,可以先统计出结果再合并到原DataFrame:
# 先统计各(DAY, JOB_TITLE)组合的数量 counts = df.groupby('DAY')['JOB_TITLE'].value_counts().reset_index(name='TYPE') # 合并到原DataFrame df = df.merge(counts, on=['DAY', 'JOB_TITLE'])
为什么之前的transform无效?
你之前的代码df.groupby('DAY')['JOB_TITLE'].transform('count')只按DAY分组,统计的是当日所有岗位的总记录数,而非每个岗位单独的数量,所以得到的结果不符合预期。
内容的提问来源于stack exchange,提问作者xtian
相关产品推荐
相关产品推荐

