pandas 数据框中的边缘列表,以使用 networkx 进行可视化
Edgelist within pandas dataframe to visualise using networkx
我在使用 networkx 将数据帧表示为网络时遇到困难。该问题似乎与数据帧的大小有关,或者,为了更好地解释,与数据帧中是否存在重复项有关。
我的数据集是
Src Dst
x.serm.cool [x.serm.cool, x.creat.cool]
x.creat.cool [x.creat.cool, x.serm.cool]
sms.sol.tr [sms.sol.tr]
bbb.asl.gt [bbb.asl.gt,cdc.fre.gh,str.alert.jf]
cdc.fre.gh [cdc.fre.gh, bbb.asl.gt,str.alert.jf]
str.alert.jf [str.alert.jf, bbb.asl.gt, cdc.fre.gh]
...
x.serm.cool [x.serm.cool]
其中 Src
的值用作节点,Dst
用作边。这意味着,例如,x.serm.cool
有两个链接,一个与自身(但不需要考虑)和另一个与 x.creat.cool
。另一个例子:str.alert.jf
有三个链接:一个是自身(但它没有值);一个带有 bbb.asl.gt
,另一个带有 cdc.fre.gh
。所有链接都是无向的。
我尝试用不同的颜色表示列表中的一些节点:
df["color"] = "blue"
df.loc[df.Src.isin(["x.serm.cool", "cdc.fre.gh "]), "color"] = "green"
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)
但由于 df["Dst"] = df.Dst.apply(lambda x: x[1:-1].split(","))
,我收到了错误消息。
正如 YOBEN_S 在相关问题中所解释的(请参阅此问题的底部),问题在于考虑列表而不是字符串。
但是,当我尝试如下时:
test=["x.serm.cool", "cdc.fre.gh "]
df['color'] = np.where(df.Src.isin(test), "blue", "green")
G = nx.from_pandas_edgelist(df.explode("Dst"), 'Src', 'Dst')
nx.draw(G, node_color = df.color)
我收到这个错误:
ValueError: 'c' argument has 79 elements, which is inconsistent with 'x' and 'y' with size 76.
我的原始数据集长度为 79
,而 76
似乎是没有 Src
重复数据集的 length/size。我认为重复项可能很重要,因为它们给出了节点的大小,所以我宁愿不要将它们从我的数据集和网络中删除。
你能帮我解决这个问题吗?
相关问答:
您遇到的问题是因为您数据中的某些项目是重复的。要解决它,你需要在相关地方使用drop_duplicates
:
df["color"] = "blue"
df.loc[df.Src.isin(["x.serm.cool", "cdc.fre.gh"]), "color"] = "green"
df["Dst"] = df.Dst.apply(lambda x: x[1:-1].split(","))
df = df.explode("Dst").drop_duplicates()
G = nx.from_pandas_edgelist(df, 'Src', 'Dst')
colors = df[["Src", "color"]].drop_duplicates()["color"]
nx.draw(G, node_color = colors)
输出:
我在使用 networkx 将数据帧表示为网络时遇到困难。该问题似乎与数据帧的大小有关,或者,为了更好地解释,与数据帧中是否存在重复项有关。
我的数据集是
Src Dst
x.serm.cool [x.serm.cool, x.creat.cool]
x.creat.cool [x.creat.cool, x.serm.cool]
sms.sol.tr [sms.sol.tr]
bbb.asl.gt [bbb.asl.gt,cdc.fre.gh,str.alert.jf]
cdc.fre.gh [cdc.fre.gh, bbb.asl.gt,str.alert.jf]
str.alert.jf [str.alert.jf, bbb.asl.gt, cdc.fre.gh]
...
x.serm.cool [x.serm.cool]
其中 Src
的值用作节点,Dst
用作边。这意味着,例如,x.serm.cool
有两个链接,一个与自身(但不需要考虑)和另一个与 x.creat.cool
。另一个例子:str.alert.jf
有三个链接:一个是自身(但它没有值);一个带有 bbb.asl.gt
,另一个带有 cdc.fre.gh
。所有链接都是无向的。
我尝试用不同的颜色表示列表中的一些节点:
df["color"] = "blue"
df.loc[df.Src.isin(["x.serm.cool", "cdc.fre.gh "]), "color"] = "green"
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)
但由于 df["Dst"] = df.Dst.apply(lambda x: x[1:-1].split(","))
,我收到了错误消息。
正如 YOBEN_S 在相关问题中所解释的(请参阅此问题的底部),问题在于考虑列表而不是字符串。
但是,当我尝试如下时:
test=["x.serm.cool", "cdc.fre.gh "]
df['color'] = np.where(df.Src.isin(test), "blue", "green")
G = nx.from_pandas_edgelist(df.explode("Dst"), 'Src', 'Dst')
nx.draw(G, node_color = df.color)
我收到这个错误:
ValueError: 'c' argument has 79 elements, which is inconsistent with 'x' and 'y' with size 76.
我的原始数据集长度为 79
,而 76
似乎是没有 Src
重复数据集的 length/size。我认为重复项可能很重要,因为它们给出了节点的大小,所以我宁愿不要将它们从我的数据集和网络中删除。
你能帮我解决这个问题吗?
相关问答:
您遇到的问题是因为您数据中的某些项目是重复的。要解决它,你需要在相关地方使用drop_duplicates
:
df["color"] = "blue"
df.loc[df.Src.isin(["x.serm.cool", "cdc.fre.gh"]), "color"] = "green"
df["Dst"] = df.Dst.apply(lambda x: x[1:-1].split(","))
df = df.explode("Dst").drop_duplicates()
G = nx.from_pandas_edgelist(df, 'Src', 'Dst')
colors = df[["Src", "color"]].drop_duplicates()["color"]
nx.draw(G, node_color = colors)
输出: