使用 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
称为d1
和Series.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:如何将列中的分组列表作为字典返回