使用 python/pandas 将分类数据分组到其他分类数据上

Posted

技术标签:

【中文标题】使用 python/pandas 将分类数据分组到其他分类数据上【英文标题】:Grouping categorical data over other categorical data with python/pandas 【发布时间】:2018-08-21 13:14:42 【问题描述】:

我有一个 pandas 数据框,其中有一列存储特定任务的名称,另一列报告执行该任务的员工的 ID 号。类似于:

EMPLOYEE_ID    TASK_NAME 

Employee1     Inspection  
Employee2     Inspection
Employee3     Inspection
Employee4     Inspection
Employee5     Inspection
Employee1     Change
Employee2     Inspection
Employee3     Change
Employee1     Change
Employee2     Change

我想知道我必须执行什么类型的命令/分析才能根据执行的任务对员工进行分组/集群。换句话说,我想说,例如,“Employee_Group_1”(包括 Employee1、Employee2、Employee3)已经完成了所有检查和变更任务的 75%。

任何帮助将不胜感激! 提前致谢。

【问题讨论】:

我对您的要求感到困惑。你能改写一下并添加这个给定数据的预期输出吗? IIUC,您可以创建一个列,将每个员工ID分配给一个员工组,然后使用groupby进行一些汇总统计。 【参考方案1】:

我相信需要map 被扁平化的dictionary 称为d1Series.value_counts

d = 'g1':['Employee1', 'Employee2', 'Employee3'],
     'g2':['Employee4', 'Employee5', 'Employee6']

d1 = k: oldk for oldk, oldv in d.items() for k in oldv
print (d1)
'Employee1': 'g1', 'Employee2': 'g1', 'Employee3': 'g1', 
 'Employee4': 'g2', 'Employee5': 'g2', 'Employee6': 'g2'

s = df['EMPLOYEE_ID'].map(d1).value_counts(normalize=True)
print (s)
g1    0.8
g2    0.2
Name: EMPLOYEE_ID, dtype: float64

如果还想分析另一列,请使用SeriesGroupBy.value_counts

df2 = (df.groupby(df['EMPLOYEE_ID'].map(d1))['TASK_NAME']
         .value_counts(normalize=True)
         .reset_index(name='norm'))
print (df2)
  EMPLOYEE_ID   TASK_NAME  norm
0          g1      Change   0.5
1          g1  Inspection   0.5
2          g2  Inspection   1.0

详情

print (df['EMPLOYEE_ID'].map(d1))
0    g1
1    g1
2    g1
3    g2
4    g2
5    g1
6    g1
7    g1
8    g1
9    g1
Name: EMPLOYEE_ID, dtype: object

【讨论】:

以上是关于使用 python/pandas 将分类数据分组到其他分类数据上的主要内容,如果未能解决你的问题,请参考以下文章

python--pandas分组聚合

Python Pandas:将日期时间列分组为小时和分钟聚合

使用条件和排名进行分组的 Python/Pandas 实现

Python Pandas:如何将列中的分组列表作为字典返回

每周分组 python pandas 数据帧(从星期一开始)

Python Pandas 使用日期时间数据按日期分组