[英]How to count combinations within a certain group?
我有人在某些日期记录某些项目时间的数据。 所以我的表格看起来像这样:
ProjectID Date memberID hours
project1 01.05 a 2
project1 01.05 b 5
project2 05.05 a 1
project2 05.05 b 2
project2 05.05 c 3
project3 07.06 a 4
project3 07.06 b 1
project3 07.06 c 2
等等
我现在想要做的是计算每个项目,对于该项目的项目成员的每个组合,他们在过去共同工作了多少时间。 如果他们都在一起工作,那么应该计算最少的小时数。 例如,如果成员1在项目上工作1小时而成员2工作2小时,那么它应该只计算1小时,因为第二个小时,他们不能一起工作。
例如
ProjectID Date memberID1 memberID2 hoursworkedtogether
project1 01.05 a b 0
project2 05.05 a b 2
project2 05.05 a c 0
project2 05.05 b c 0
project3 07.06 a b 3
project3 07.06 b c 2
project3 07.06 a c 1
我已经尝试使用数据透视表进行聚合,但这不起作用,因为两个项目成员将始终位于原始数据中的不同行中,并且数据透视图不会计算它看起来在同一行中的值组合。
一种方法是在所有项目上编写一个简单的循环和循环,但我觉得应该有一个更有效的选项,因为表非常大。
我不确定,如果这是最快的解决方案,但是带有列表pandas.apply()
必须有点快...... ;-)
按ProjectID
和Date
数据进行分组,并使用itertools.combinations()
创建每个项目的所有用户组合。
import pandas as pd
df = pd.DataFrame([['project1', '01.05', 'a', 2],
['project1', '01.05', 'b', 5],
['project2', '05.05', 'a', 1],
['project2', '05.05', 'b', 2],
['project2', '05.05', 'c', 3],
['project3', '07.06', 'a', 4],
['project3', '07.06', 'b', 1],
['project3', '07.06', 'c', 2]],
columns=['ProjectID', 'Date', 'memberID', 'hours'])
from itertools import combinations
def calc_member_hours(project):
data = [(x[0],
x[1],
*min(project['hours'][project['memberID']==x[0]].values,project['hours'][project['memberID']==x[1]].values))
for x in list(combinations(project['memberID'],2))]
df = pd.DataFrame(data, columns=['memberID1', 'memberID2', 'hoursworkedtogether'])
return df
result_df = df.groupby(['ProjectID', 'Date']).apply(calc_member_hours)
result_df
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.