如何操作Pandas多级索引Series以分析员工班次异常数据?
处理Pandas多级索引Series生成异常班次组合列表及新增列方案
需求背景
通过Pandas统计指定日期的员工类型数量,识别异常值(班次与日期组合的数量≠2),需要从多级索引Series生成对应异常组合的元组列表,并为原DataFrame添加Worked a Double和Over staffed两列。
原始数据与统计代码
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) df1 = df[['JOB_TITLE', 'DAY']].groupby('DAY') shifts_series = df1['JOB_TITLE'].value_counts()
统计后得到的多级索引Series:
DAY JOB_TITLE Friday Cashier 2 Cook 2 Saturday Cook 2 Cashier 1 Thursday Cashier 3 Cook 1 Name: JOB_TITLE, dtype: int64
生成异常组合元组列表
直接对多级索引Series使用布尔索引筛选,再提取索引转为列表即可(多级索引的每个元素本身就是(DAY, JOB_TITLE)格式的元组):
# 提取数量等于1的(日期,岗位)组合列表 count_1_combinations = shifts_series[shifts_series == 1].index.tolist() # 提取数量大于2的(日期,岗位)组合列表 count_over2_combinations = shifts_series[shifts_series > 2].index.tolist()
执行后得到:
- 数量等于1的组合:
[('Saturday', 'Cashier'), ('Thursday', 'Cook')] - 数量大于2的组合:
[('Thursday', 'Cashier')]
为原DataFrame新增状态列
推荐使用合并统计结果的方式实现(比apply更高效):
# 将统计Series转为DataFrame,重命名计数列 count_df = shifts_series.reset_index(name='SHIFT_COUNT') # 合并统计结果到原DataFrame df = df.merge(count_df, on=['DAY', 'JOB_TITLE'], how='left') # 根据计数生成状态列 df['Worked a Double'] = df['SHIFT_COUNT'] == 1 df['Over staffed'] = df['SHIFT_COUNT'] > 2 # 可选:删除中间计数列 df.drop('SHIFT_COUNT', axis=1, inplace=True)
最终DataFrame部分结果示例:
| JOB_TITLE | DAY | Worked a Double | Over staffed |
|---|---|---|---|
| Cashier | Thursday | False | True |
| Cashier | Thursday | False | True |
| Cashier | Thursday | False | True |
| Cook | Thursday | True | False |
| Cashier | Friday | False | False |
内容的提问来源于stack exchange,提问作者xtian
相关产品推荐
相关产品推荐

