2016-03-03 71 views
1

我有一個像下面Python:如何從熊貓數據框創建協作網絡?

df = pd.DataFrame({'Item':['A','A','A','B','B','C','C','C','C'], 
    'Name': ['Tom','John','Paul','Tom','Frank','Tom', 'John', 'Richard', 'James'], 
    'Total':[3,3,3,2,2,4,4,4,4]}) 

print df 

Item Name Total 
A Tom  3 
A John 3 
A Paul 3 
B Tom  2 
B Frank 2 
C Tom  4 
C John 4 
C Richard 4 
C James 4 

我想創建協作的網絡,這是在兩對的Name在同一Item數量之間的Total合作歸一個數據幀。最後我想像

df1 

Name  Name1  Item  Total 
Tom  John  A   3 
Tom  John  C   4 
Tom  Paul  A   3 
Tom  Frank  B   2 
Tom  Richard  C   4 
Tom  James  C   4 
John Paul  A   3 
John Richard  C   4 
Richard James  C   4 

回答

1

我認爲這得到你想要的。我使用groupby來連接組中的兩個名稱和itertools.combinationsItem

cnxns = [] 
for k,g in df.groupby('Item'): 
    [cnxns.extend((n1,n2,k,len(g)) for n1,n2 in combinations(g['Name'], 2))] 

pd.DataFrame(cnxns, columns=['Name', 'Name1', 'Item', 'Total']) 

    Name Name1 Item Total 
0 Tom  John  A 3 
1 Tom  Paul  A 3 
2 John Paul  A 3 
3 Tom  Frank  B 2 
4 Tom  John  C 4 
5 Tom  Richard  C 4 
6 Tom  James  C 4 
7 John Richard  C 4 
8 John James  C 4 
9 Richard  James C 4 

可能是一個更好的方法,但這應該做你所要求的。

我的輸出和所需輸出之間的唯一區別是,我包括(John, James, C, 4),但也許你想要一個(假設我理解正確的問題)?

+0

它是:但總數可能會改變。是否可以採用列中報告的值而不是總和? – emax

+0

您可以將'len(g)'更改爲'g ['Total']。iloc [0]',它將從原始DataFrame中獲取一個值。如果這就是你想要的,我會編輯答案? – Kevin