[英]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.