我有一个像这样的数据框:
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 |
答案 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
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)
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