来自熊猫数据帧的边缘列表,其中具有不同颜色的节点

时间:2020-08-03 10:24:47

标签: python pandas networkx

我有以下数据框:

Src  Dst
A    [A,B]
B    [B,A]
C    [C]
D    [D,E,F]
E    [E,D,F]
F    [F,D,E]
...

我想生成一个网络,其中Src是节点,Dst是边,并且新列Weight可以为节点分配不同的颜色(绿色)是A或D,其他都一样(例如蓝色)。

我尝试如下:

创建新的列权重

nd=["A","D"]
df['Weight'] = np.where(df.Src.isin(nd), 1, 0)

这里的问题是我不知道如何分配颜色,所以我只是尝试为A或D分配值1,为所有其他值分配值0,并分别更改颜色。

对于图形,我使用了以下

G = nx.from_pandas_edgelist(df, 'Src', 'Dst')

上面的代码行与Dst中的节点的行未连接,我无法理解原因。 我发现了一些可能有助于分配颜色的东西:

   colors=[]
for n in df.Src:
    if n in df.Weight:
        colors.append('g')
    else:
        colors.append('b')

# nodes
nx.draw_networkx_nodes(G,pos, node_color = colors)

但是我遇到了这个错误:

ValueError:'c'参数包含79个元素,与以下元素不一致 尺寸为76的“ x”和“ y”。

下面的图片将类似于我的预期输出(AD节点为绿色,其他节点为蓝色,并且基于Dst数据的链接;请注意,下面的图片当前不重现颜色或预期边缘。

enter image description here

您能帮我给我一些建议吗?

1 个答案:

答案 0 :(得分:1)

这是一种实现方法:

df["color"] = "blue"
df.loc[df.Src.isin(["A", "D"]), "color"] = "green"

# The following line is needed because, at least in the way my dataset 
# is created, 'Dst' is not a list but rather a string. 
# For example, Dst of 'A' is the string "[A,B]". Here, 
# I'm converting it to the list ["A", "B"]
# If your data doesn't need this, just comment this line out. 
df["Dst"] = df.Dst.apply(lambda x: x[1:-1].split(","))

G = nx.from_pandas_edgelist(df.explode("Dst"), 'Src', 'Dst')
nx.draw(G, node_color = df.color)

输出为:

enter image description here