从这个简单的数据框开始:
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]
但是我依旧按照自己的意愿对用户进行分组。
编辑: 修复了创建新列时的错误。
答案 0 :(得分: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())
结果:[('a','d'),('a','f'),('c','b'),('e','g'),('d' ,'f')]
这里的技巧是在pandas中同时按2列分组。然后,您可以创建要添加到图表中的所有边的组合。