Python 在构建NetworkX图形时避免NaN属性

Python 在构建NetworkX图形时避免NaN属性,python,pandas,csv,networkx,nan,Python,Pandas,Csv,Networkx,Nan,我想使用pandas读取包含节点及其属性的csv文件。并非所有节点都具有每个属性,缺少的属性只是csv文件中缺少的属性。熊猫读取csv文件时,缺少的值显示为nan。我想从数据帧批量添加节点,但避免添加nan属性 例如,下面是一个名为mwe.csv的示例csv文件: Name,Cost,Depth,Class,Mean,SD,CST,SL,Time Manuf_0001,39.00,1,Manuf,,,12,,10.00 Manuf_0002,36.00,1,Manuf,,,8,,10.00 Pa

我想使用pandas读取包含节点及其属性的csv文件。并非所有节点都具有每个属性,缺少的属性只是csv文件中缺少的属性。熊猫读取csv文件时,缺少的值显示为
nan
。我想从数据帧批量添加节点,但避免添加
nan
属性

例如,下面是一个名为
mwe.csv
的示例csv文件:

Name,Cost,Depth,Class,Mean,SD,CST,SL,Time
Manuf_0001,39.00,1,Manuf,,,12,,10.00
Manuf_0002,36.00,1,Manuf,,,8,,10.00
Part_0001,12.00,2,Part,,,,,28.00
Part_0002,5.00,2,Part,,,,,15.00
Part_0003,9.00,2,Part,,,,,10.00
Retail_0001,0.00,0,Retail,253,36.62,0,0.95,0.00
Retail_0002,0.00,0,Retail,45,1,0,0.95,0.00
Retail_0003,0.00,0,Retail,75,2,0,0.95,0.00
以下是我目前的处理方式:

将熊猫作为pd导入
将numpy作为np导入
将networkx导入为nx
node_df=pd.read_csv('mwe.csv'))
graph=nx.DiGraph()
图.从(node_df['Name'])添加节点
nx.set_node_属性(图形,dict(zip(node_df['Name'],node_df['Cost']),'nodeCost'))
nx.设置节点属性(图形、dict(zip(节点名称、节点平均值)、avgDemand)
nx.set_node_属性(图形,dict(zip(node_df['Name'],node_df['SD']),'sdDemand')
nx.设置节点属性(图形、dict(zip(node_df['Name'],node_df['CST'])、'servTime')
nx.set_node_属性(图形,dict(zip(node_df['Name'],node_df['SL']),'servLevel'))
#循环遍历所有节点和所有属性并删除NAN。
对于graph.nodes中的i:
对于列表中的k,v(graph.nodes[i].items()):
如果np.isnan(v):
del graph.nodes[i][k]

它能用,但很笨重。是否有更好的方法,例如,在添加节点时避免出现
nan
s,而不是在添加节点后删除
nan
s?

在这种情况下,您可以利用Pandas的力量进行竞价。因此,我创建了这个函数,它将具有两个键和值列的数据帧转换为一个系列,然后使用NaN删除元素,最后将其更改为字典

def create_node_attribs(key_col, val_col):
    # Upto you if you want to pass the dataframe as argument
    # In your case, since this was the only df, I only passed the columns
    global node_df
    return Series(node_df[val_col].values,
                  index=node_df[key_col]).dropna().to_dict()
这是完整的代码

import pandas as pd
import networkx as nx
from pandas import Series

node_df = pd.read_csv('mwe.csv')

graph = nx.DiGraph()

def create_node_attribs(key_col, val_col):
    # Upto you if you want to pass the dataframe as argument
    # In your case, since this was the only df, I only passed the columns
    global node_df
    return Series(node_df[val_col].values,
                  index=node_df[key_col]).dropna().to_dict()

graph.add_nodes_from(node_df['Name'])
nx.set_node_attributes(graph, create_node_attribs('Name', 'Cost'), 'nodeCost')
nx.set_node_attributes(graph, create_node_attribs('Name', 'Mean'), 'avgDemand')
nx.set_node_attributes(graph, create_node_attribs('Name', 'SD'), 'sdDemand')
nx.set_node_attributes(graph, create_node_attribs('Name', 'CST'), 'servTime')
nx.set_node_attributes(graph, create_node_attribs('Name', 'SL'), 'servLevel')
用代码链接到


另外,有关当前所用方法的时间比较的详细信息。

将csv导入到Pandas时,请使用
保留默认值\u na

pd.read_csv('data.csv', keep_default_na=False)