转换数据帧以进行网络图形化

时间:2018-03-03 00:58:20

标签: python pandas networkx

我有一个像这样的数据框:

ID  | Node 1 | Node 2 | Node 3
a   |   1    |    0   |   1
b   |   0    |    1   |   1
c   |   1    |    0   |   0
d   |   1    |    1   |   1
e   |   0    |    1   |   1

我想更改它,以便我可以将其转换为网络图表,其中节点之间的连接是指示两者的ID的次数:

Node A | Node B | Weight |
Node 1 | Node 2 |    1   |
Node 1 | Node 3 |    2   |
Node 2 | Node 3 |    3   |

3 个答案:

答案 0 :(得分:1)

而不是有一个边列表形式

Node A | Node B | Weight |
Node 1 | Node 2 |    1   |
Node 1 | Node 3 |    2   |
Node 2 | Node 3 |    3   |

您还可以计算共现/邻接矩阵来表示您感兴趣的关系。它可以使用点积构建。 alko已在Constructing a co-occurrence matrix in python pandas

中给出了大熊猫的答案

我使用numpy

修改了alko的答案
m = df.values.T.dot(df.values)
np.fill_diagonal(m, 0)

# array([[0, 1, 2],
#       [1, 0, 3],
#       [2, 3, 0]])
# You can use nx.from_numpy_matrix to construct a graph
# m[i, j] is the number of co-occurance between node i and node j.

我不喜欢alko的答案之一是它试图通过改变df来改变数据帧的对角线部分,比如说df.values。不应提升直接更改df.values以更改df,因为有时df.values会返回副本而有时会返回视图。有关详细信息,请参阅我之前的问题Will changes in DataFrame.values always modify the values in the data frame?

如果想要遵循alko的pandas方法,可以用

替换np.fill_diagonal(df.values, 0)

df = df - np.eye(len(df)) * np.diagonal(df)

答案 1 :(得分:1)

数据帧到邻接矩阵

您可以遍历数据框以创建一个numpy数组:

array([[ 0.,  1.,  2.],
       [ 1.,  0.,  3.],
       [ 2.,  3.,  0.]])

G = nx.Graph(mat) G.edges(data=True)

来自numpy adjency矩阵的Networkx图

EdgeDataView([(0, 1, {'weight': 1.0}), (0, 2, {'weight': 2.0}), (1, 2, {'weight': 3.0})])

[out]:jQuery(".bizinfo h4").text(function (index, text) { return text.replace(/test/g, ", "); });

答案 2 :(得分:0)

您可以先使用itertools查找所有组合,然后找到每对的权重。

import itertools
(
     pd.DataFrame(list(itertools.combinations(df.set_index('ID').columns,2)), 
                  columns=['Node A', 'Node B'])
     .assign(Weight=lambda y: y.apply(lambda x: df[[x['Node A'],x['Node B']]]
                                                .all(1).sum(), axis=1))
)

Out[39]: 
   Node A  Node B  Weight
0  Node 1  Node 2       1
1  Node 1  Node 3       2
2  Node 2  Node 3       3