无向图中心性分析异常:辛普森数据集NetworkX问题排查
问题根源与解决方法
核心问题
你现在的度数异常完全是因为错误的表合并和NaN处理方式导致的:
- 用
outer join合并节点表和边表后,所有没有对应边的节点都会生成一行Source=节点ID, Target=NaN, Weight=NaN的记录 - 你用
fillna(0)把这些NaN改成0,相当于给每个孤立节点都创建了一条连向不存在的0节点的边 - 手动把节点1的Source设为1后,又多了一条
1-0的边,加上其他节点连向0的边,节点1的度数里包含了大量和0的无效连接,完全偏离了真实的社交网络结构
修正后的代码
根本不需要合并节点表和边表来创建图,NetworkX只需要边表就能构建网络,节点表用来补充节点属性即可:
import pandas as pd import networkx as nx # 1. 读取边表,直接构建无向图 dfE = pd.read_csv('gdrive/My Drive/SNA/simpsonsEdges.csv') graph = nx.from_pandas_edgelist(dfE, 'Source', 'Target', edge_attr='Weight', create_using=nx.Graph()) # 2. 读取节点表,添加节点名称属性 dfN = pd.read_csv('gdrive/My Drive/SNA/simpsonsNodes.csv') node_attrs = dfN.set_index('Id')['Name'].to_dict() nx.set_node_attributes(graph, node_attrs, 'Name') # 验证无向图属性 print(graph.is_directed())
额外说明
- 如果你想保留所有节点(包括没有任何边的孤立角色),可以用节点表手动添加:
# 添加所有节点到图中 graph.add_nodes_from(dfN['Id'].tolist()) # 再设置节点属性 nx.set_node_attributes(graph, node_attrs, 'Name') - 现在重新计算度数中心性和接近中心性,结果就会符合《辛普森一家》的角色核心度预期——比如Homer、Marge这些核心角色的中心性会远高于其他角色。
内容的提问来源于stack exchange,提问作者Fio
相关产品推荐
相关产品推荐

