【发布时间】:2016-08-12 00:22:42
【问题描述】:
我有一个数据框 df=
Owner Manager Date Hours City
John Jerry 1/2/16 10 LA
John Jerry 1/2/16 10 SF
Mary Jerry 1/2/16 9 LA
Zach Joe 1/3/16 5 SD
Wendy Joe 1/3/16 4 SF
Hal Joe 1/4/16 2 SD
... 100,000 个条目
我想按“经理”和“日期”分组,然后选择“所有者”的唯一值并对该选择的“小时”求和,最后将总和转换为新列“小时_by_经理”。
我想要的输出是:
Owner Manager Date Hours City Hours_by_Manager
John Jerry 1/2/16 10 LA 19
John Jerry 1/2/16 10 SF 19
Mary Jerry 1/2/16 9 LA 19
Zach Joe 1/3/16 5 SD 9
Wendy Joe 1/3/16 4 SF 9
Hal Joe 1/4/16 2 SD 2
我尝试像这样使用 pandas 'groupby':
df['Hours_by_Manager']=df.groupby(['Manager','Date'])['Hours'].transform(lambda x: sum(x.unique()))
这给了我想要的东西,但这只是因为“所有者”之间的小时值不同。我正在寻找的是这样的:
df['Hours_by_Manager']=df.groupby(['Manager','Date'])['Owner'].unique()['Hours']transform(lambda x: sum(x))
这显然在语法上是不正确的。我知道我可以使用 for 循环,但我想保持向量化。有什么建议吗?
【问题讨论】:
-
假设有另一行以
Mary作为所有者,相同的经理和日期,但Hours的数量不同,比如19。结果应该是什么?特别是John的结果应该是什么? -
小时与“所有者”在特定“日期”的工作时间相关联。 “所有者”始终与特定的“经理”相关联。所以玛丽在给定日期永远不会有不同的小时数。从这个意义上说,Hours 的值将是多余的。这就是为什么 John 和 Mary 的两个实例的“Hours_by_Manager”的结果都是 19,因为它们与经理 Jerry 相关联。
标签: pandas transform unique grouping