2016-01-29 50 views
1

从这个简单的数据帧开始:熊猫 - 根据列重塑数据帧到边缘列表值

node t1 t2 
0 a pos neg 
1 b neg neg 
2 c neg neg 
3 d pos neg 
4 e neg pos 
5 f pos neg 
6 g neg pos 

我想建立一个EdgeList都文件读取它作为一个无向网络。预期的输出是:

b c 
a d 
a f 
d f 
e g 

所以基本上我连接两个节点,如果他们在['t1','t2']列相同的值对。到目前为止,我第一次尝试以组值到一个新的列:

d['c'] = [tuple(i) for i in df[['t1','t2']].values] 

但后来我在分组用户如我所愿stucked。

编辑: 修复创建新列的错误。

回答

2

看一看此:

df = pd.DataFrame({'node': ['a', 'b','c', 'd', 'e', 'f', 'g'], 
       't1': ['pos', 'neg', 'neg', 'pos', 'neg', 'pos', 'neg'], 
       't2': ['neg', 'neg', 'neg', 'neg', 'pos', 'neg', 'pos']}) 

K = nx.Graph() 
K.add_nodes_from(df['node'].values) 

# Create edges 
for i, group in df.groupby(['t1', 't2'])['node']: 
    # generate all combinations without replacement 
    # from the group of similar column pairs 
    for u, v in itertools.combinations(group, 2):   
     K.add_edge(u, v) 

print(K.edges()) 

结果:[( '一个', 'd'),( '一个', 'F'),( 'C', 'B' ),( 'E', 'G'),( 'd', 'F')]

这里的关键是要组通过在大熊猫同时2列。然后,您可以创建边的所有组合以添加到图中。