如何将NetworkX节点度数值添加至原始Pandas DataFrame?
解决NetworkX节点度数添加到Pandas DataFrame的问题
问题场景
你的DataFrame结构如下:
| Focal_Coach | sibling_coach_id | years_under_focal | coach_name |
|---|---|---|---|
| 1 | 2 | 10 | Bill Belichick |
| 1 | 3 | 4 | Bill Belichick |
| 2 | 4 | 6 | Andy Reid |
通过NetworkX构建加权图并重新命名节点后,执行sibling_df_agg['Degree']=G_weighted.degree(sibling_df_agg['coach_name'])得到的是包含节点名称和度数的元组,无法直接进行数值操作。
最佳实现方法
方法1:将度数转换为字典后映射(推荐)
先把NetworkX返回的度数结果转换成字典,再利用Pandas的map方法快速匹配每个教练的度数:
# 生成度数字典:键是教练名称,值是对应的度数 degree_dict = dict(G_weighted.degree()) # 映射到DataFrame的新列中 sibling_df_agg['Degree'] = sibling_df_agg['coach_name'].map(degree_dict)
方法2:使用apply提取元组的数值
如果已经生成了包含元组的Degree列,可以直接用apply提取元组的数值部分:
# 提取元组的第二个元素(度数数值) sibling_df_agg['Degree'] = sibling_df_agg['Degree'].apply(lambda x: x[1])
方法3:通过节点属性获取度数
先将度数设为图的节点属性,再提取映射到DataFrame:
# 给所有节点添加degree属性 nx.set_node_attributes(G_weighted, dict(G_weighted.degree()), 'degree') # 提取属性值到DataFrame sibling_df_agg['Degree'] = sibling_df_agg['coach_name'].apply(lambda x: G_weighted.nodes[x]['degree'])
效果验证
处理后的DataFrame会变为:
| Focal_Coach | sibling_coach_id | years_under_focal | coach_name | Degree |
|---|---|---|---|---|
| 1 | 2 | 10 | Bill Belichick | 2 |
| 1 | 3 | 4 | Bill Belichick | 2 |
| 2 | 4 | 6 | Andy Reid | 1 |
此时可直接执行数值操作,比如筛选度数大于指定值的数据:
# 筛选度数大于1的教练数据 filtered_df = sibling_df_agg[sibling_df_agg['Degree'] > 1]
内容的提问来源于stack exchange,提问作者Stephen Juza
相关产品推荐
相关产品推荐

