Ошибка типа при назначении атрибутов узла в NetworkX - PullRequest
1 голос
/ 21 июня 2019

Я пытаюсь добавить атрибуты в ряд узлов в двудольном графе NetworkX.Один набор узлов - это имена сотрудников;другой набор - названия фильмов.Они выглядят так:

# This is the set of employees
employees = set(['Pablo',
                 'Lee',
                 'Georgia',
                 'Vincent',
                 'Andy',
                 'Frida',
                 'Joan',
                 'Claude'])

# This is the set of movies
movies = set(['The Shawshank Redemption',
              'Forrest Gump',
              'The Matrix',
              'Anaconda',
              'The Social Network',
              'The Godfather',
              'Monty Python and the Holy Grail',
              'Snakes on a Plane',
              'Kung Fu Panda',
              'The Dark Knight',
              'Mean Girls'])

У меня есть данные сети в кадре данных Pandas:

df = df = pd.read_csv('Employee_Movie_Choices.txt', sep='\t')

     #Employee     Movie
0   Andy      Anaconda
1   Andy      Mean Girls
2   Andy      The Matrix
3   Claude    Anaconda
4   Claude    Monty Python and the Holy Grail

Из которого я создаю график NetworkX:

B = nx.from_pandas_dataframe(df, '#Employee', 'Movie')

Затем я пытаюсь добавить следующие атрибуты к узлам с помощью следующего цикла:

for e in employees:
    nx.set_node_attributes(B, {e: {'type'='employee'}})

for m in movies:
    nx.set_node_attributes(B, {m: {'type'='movie'}})

Но получаю следующую ошибку:

TypeError: set_node_attributes() missing 1 required positional argument: 'values'

Я не могу решить эту проблему.Я также попробовал это:

for e in emplyoees:
    nx.set_node_attributes(B, name='type', values='employee')

for m in movies:
    nx.set_node_attributes(B, name='type', values='movie')

Но каждый цикл for назначает свое значение, то есть «employee» или «movie», каждому узлу.Таким образом, фильмы будут помечены как сотрудники вместе с сотрудниками, а сотрудники будут помечены как фильмы вместе с фильмами.

Любая помощь с этим очень ценится!

1 Ответ

1 голос
/ 23 июня 2019

Просмотрите документацию для функции nx.set_node_attributes.

Функция берет словарь, в котором ключи - это узлы, а значения - атрибуты (сотрудник или фильм в вашем примере). Его нельзя использовать для обновления узлов один за другим. Вот один из обходных путей, где мы сначала создаем словарный узел: node_type, затем за один шаг устанавливаем атрибут узла:

node_attribute_dict = {}
for employee in employees:
    node_attribute_dict[employee]='employee'
for movie in movies:
    node_attribute_dict[movie]='movie'

nx.set_node_attributes(B,values = node_attribute_dict,name='node_type')
...