使用NetworkX读取CSV边列表构建图时遇KeyError: 'source'求助
解决NetworkX读取边列表时的KeyError问题
错误原因
nx.from_pandas_edgelist默认会查找名为source(小写)和target(小写)的列,但你的CSV文件存在两个不匹配问题:
- 第一列表头拼写错误:写成了
Surce(正确应为Source) - 第二列表头是大写的
Target,和函数默认的target命名不符
这两个问题导致函数找不到预期的列,触发KeyError: 'source'。
解决方案
方案1:修改CSV表头
直接把CSV的第一行改成:
source,target,genre_ids
修改后原代码无需改动即可正常运行。
方案2:在代码中显式指定列名
如果不想修改CSV文件,就在from_pandas_edgelist中通过source和target参数指定对应列名,同时可以顺便清理节点名的多余空格(比如示例里Happy Feet, Froze,23中的Froze前面带空格):
修改后的完整代码:
import pandas as pd import networkx as nx # 读取CSV文件 df = pd.read_csv('edges1.csv') # 清理节点名前后的空格,避免节点名带空格导致识别错误 df['Surce'] = df['Surce'].str.strip() df['Target'] = df['Target'].str.strip() # 显式指定源节点和目标节点的列名 Graphtype = nx.Graph() G = nx.from_pandas_edgelist(df, source='Surce', target='Target', edge_attr='genre_ids', create_using=Graphtype) # 计算介数中心性 centrality = nx.betweenness_centrality(G, normalize=False) print(centrality)
额外提示
CSV示例第三行的Froze前面有多余空格,会导致该节点被识别为 Froze(带空格),和正常的Froze被视为两个不同节点,建议用代码中的str.strip()处理所有节点列,避免这类问题。
内容的提问来源于stack exchange,提问作者Elly
相关产品推荐
相关产品推荐

