2016-03-03 73 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