Избегайте атрибутов NaN при построении графика NetworkX - PullRequest
2 голосов
/ 23 марта 2019

Я хочу использовать панды для чтения файла CSV, который содержит узлы и их атрибуты.Не все узлы имеют каждый атрибут, а отсутствующие атрибуты просто отсутствуют в файле CSV.Когда pandas читает файл csv, пропущенные значения отображаются как nan.Я хочу добавить узлы навалом из фрейма данных, но избегайте добавления атрибутов nan.

Например, вот пример CSV-файла с именем mwe.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

Вот как я сейчас работаю с этим:

import pandas as pd
import numpy as np
import networkx as nx

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

graph = nx.DiGraph()
graph.add_nodes_from(node_df['Name'])
nx.set_node_attributes(graph, dict(zip(node_df['Name'], node_df['Cost'])), 'nodeCost')
nx.set_node_attributes(graph, dict(zip(node_df['Name'], node_df['Mean'])), 'avgDemand')
nx.set_node_attributes(graph, dict(zip(node_df['Name'], node_df['SD'])), 'sdDemand')
nx.set_node_attributes(graph, dict(zip(node_df['Name'], node_df['CST'])), 'servTime')
nx.set_node_attributes(graph, dict(zip(node_df['Name'], node_df['SL'])), 'servLevel')

# Loop through all nodes and all attributes and remove NaNs.
for i in graph.nodes:
    for k, v in list(graph.nodes[i].items()):
        if np.isnan(v):
            del graph.nodes[i][k]

Это работает,но это неуклюжеЕсть ли лучший способ, например, способ избежать nan s при добавлении узлов, вместо удаления nan s впоследствии?

1 Ответ

1 голос
/ 27 марта 2019

В этом случае вы можете использовать силу Панд для выполнения ваших торгов. Итак, я создал эту функцию, которая преобразует ваш DataFrame с двумя столбцами ключа и значения в серию, затем удаляет элементы с 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')

Ссылка на Блокнот Google Colab с кодом.

Кроме того, см. Этот ответ , для получения дополнительной информации о сравнении времени используемого метода.

...