基于CSV文件构建图并计算边关联节点共同邻居的问题求助
修复图加载错误及共同邻居计算问题
问题根源
你的代码存在三个核心问题:
- 错误遍历DataFrame结构:
for row in node和for row in edges实际是遍历DataFrame的列名,而非逐行读取节点/边数据,导致仅加载了少量节点和边。 - CSV读取未处理列名:
nodes.csv和edges.csv无列名,但pd.read_csv默认将第一行数据当作列名,导致后续数据未被正确读取。 - 节点类型不匹配:CSV读取的节点ID可能为字符串类型,与代码中使用的整数ID不匹配,触发"u is not in the graph"错误。
修复后的完整代码
import networkx as nx import pandas as pd G = nx.Graph() # 读取节点文件:指定无列名,将所有节点ID转为整数后添加到图中 nodes_df = pd.read_csv("nodes.csv", header=None) for node_id in nodes_df[0].astype(int): G.add_node(node_id) # 读取边文件:指定无列名,按空格分隔(若你的CSV用逗号分隔,改为sep=",") edges_df = pd.read_csv("edges.csv", header=None, sep=" ") for _, row in edges_df.iterrows(): u = int(row[0]) v = int(row[1]) # 跳过空值行,避免无效边 if pd.notna(u) and pd.notna(v): G.add_edge(u, v) print(G) # 现在应显示182个节点和300条边 def predict(u, v): # 先校验节点是否存在于图中 if u not in G or v not in G: return 0.0 common_neighbors = list(nx.common_neighbors(G, u, v)) degree_product = G.degree(u) * G.degree(v) return len(common_neighbors) / degree_product if degree_product != 0 else 0.0 # 遍历所有边计算共同邻居指标 for _, row in edges_df.iterrows(): u = int(row[0]) v = int(row[1]) score = predict(u, v) print(f"边({u}, {v})的共同邻居指标:{score:.4f}") # 可选:将计算结果保存到CSV文件 output_df = pd.DataFrame([ (int(row[0]), int(row[1]), predict(int(row[0]), int(row[1]))) for _, row in edges_df.iterrows() ], columns=["节点1", "节点2", "共同邻居指标"]) output_df.to_csv("边共同邻居指标.csv", index=False)
关键修复点说明
header=None:明确告诉pandas CSV文件没有列名,避免将第一行数据误判为列名。astype(int):强制将节点ID转为整数,保证图中节点与遍历使用的ID类型完全一致。iterrows():正确遍历DataFrame的每行数据,获取每条边的两个节点ID。- 节点存在性检查:在
predict函数中先确认节点在图中,避免因数据异常导致的报错。
内容的提问来源于stack exchange,提问作者raghad
相关产品推荐
相关产品推荐

