使用Pyvis和Pandas创建网络图边时的异常问题排查
问题分析与解决方案
问题根源
你的代码中df.dropna(subset=['mainartist', 'artistrel', 'artistlu'])这一行会过滤掉所有mainartist为空的行——由于你的mainartist列仅第一行有数据,其他行都是空值,过滤后DataFrame只剩下第一行数据,导致后续循环只能执行一次,自然无法批量生成边。
修改后的代码
from pyvis.network import Network import pandas as pd net = Network() file_loc = "/Users/jamiekonincks/Documents/programmeren/Data/network_chart/art_templ1.xlsx" df = pd.read_excel(file_loc, usecols=["mainartist", "artistrel", "artistlu"]) # 提取唯一的主艺术家(确保非空) mainartist = df['mainartist'].dropna().iloc[0] # 添加主艺术家节点 net.add_node(mainartist, label=mainartist, color='#3da831', size=20) # 仅过滤掉artistrel或artistlu为空的行,保留所有有效关联艺术家行 filtered_df = df.dropna(subset=['artistrel', 'artistlu']) # 记录已添加的节点,避免重复添加 added_nodes = {mainartist} # 遍历所有关联艺术家行 for _, row in filtered_df.iterrows(): artistrel = row['artistrel'] artistlu = row['artistlu'] # 添加artistrel节点(如果未添加过) if artistrel not in added_nodes: net.add_node(artistrel, label=artistrel, color='#9a31a8', size=20) added_nodes.add(artistrel) # 添加artistlu节点(如果未添加过) if artistlu not in added_nodes: net.add_node(artistlu, label=artistlu, color='#9a31a8', size=20) added_nodes.add(artistlu) # 添加主艺术家与两个关联艺术家的边 net.add_edge(mainartist, artistrel, width=2) net.add_edge(mainartist, artistlu, width=2) # 可视化设置 net.toggle_physics(False) net.barnes_hut() net.show_buttons(filter_=['physics']) net.show('list_of_nodes_with_color.html')
关键修改说明
- 调整数据过滤逻辑:不再过滤
mainartist为空的行,仅保留artistrel和artistlu非空的行,确保所有关联艺术家数据都能被遍历。 - 提取主艺术家:单独提取
mainartist列中非空的第一个值,保证后续使用的主艺术家有效。 - 避免重复节点:用集合
added_nodes记录已添加的节点,防止同一艺术家被重复添加(Pyvis允许重复添加节点,但会导致冗余,此优化可提升效率)。
内容的提问来源于stack exchange,提问作者jkonams
相关产品推荐
相关产品推荐

