Python:如何从 pandas 数据框创建协作网络?
Python: how to create network of collaboration from pandas data frame?
我有一个如下所示的 DataFrame
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
我想创建一个协作网络,该网络在两对之间的 Total
协作和同一对 Item
上的 Name
数量上标准化。最后我想要
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
我想这就是你想要的。我在群里用了groupby
to group by the Item
that connects two Names and itertools.combinations
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)
,但也许你想要那个(假设我理解正确的问题)?
我有一个如下所示的 DataFrame
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
我想创建一个协作网络,该网络在两对之间的 Total
协作和同一对 Item
上的 Name
数量上标准化。最后我想要
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
我想这就是你想要的。我在群里用了groupby
to group by the Item
that connects two Names and itertools.combinations
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)
,但也许你想要那个(假设我理解正确的问题)?