2017-09-19 1 views
0

J'utilise networkx pour créer une structure de réseau de messagerie à partir d'un fichier txt où chaque ligne représente un "bord". I chargé en premier le fichier txt (3 colonnes: { '#Sender', 'destinataire', 'temps'}) en python et ensuite converti en un objet networkx utilisant le code suivant:Le nombre d'arêtes est différent lors de la conversion d'une trame de données pandas en objet Networkx

import networkx as nx 
 
import pandas as pd 
 
email_df = pd.read_csv('email_network.txt', delimiter = '->') 
 
email = nx.from_pandas_dataframe(email_df, '#Sender', 'Recipient', edge_attr = 'time')

Les données email.txt sont accessibles here.

Cependant, email_df (un pandas objet DataFrame) a une longueur de 82927, alors que email (un objet Networkx) a une longueur de 3251.

In [1]: len(email_df) 
In [2]: 82927 
In [3]: len(email.edges()) 
In [4]: 3251 

Je suis vraiment confus parce que même si les lignes contenant la mêmes deux nœuds dans les deux premières colonnes de email_df avec la même séquence de direction (par exemple, '1' à '2'), la troisième colonne ('temps', ce qui signifie timestamped) devrait les distinguer les uns des autres, par conséquent, pas répliqué les bords apparaîtraient. Alors pourquoi le nombre d'arêtes a considérablement diminué de 82927 à 3251 après avoir utilisé nx.from_pandas_dataframe pour lire `email_df '?

Est-ce que quelqu'un pourrait m'aider à m'expliquer cela?

Merci.

+0

fenêtres de code sont destinés pour le code JS seulement. Pour toutes les autres langues, collez votre code, mettez-le en surbrillance et appuyez sur ctrl + k pour le formater. –

Répondre

1

Votre ligne ici dit de prendre la colonne Sender comme nœud source, la colonne Recipient comme cible et ajoutez les attributs time comme bord. Ainsi, vous ne créez qu'un seul bord (dirigé) entre l'expéditeur et le destinataire, et seul l'instant de la dernière ligne sera ajouté en tant qu'attribut du bord.

email = nx.from_pandas_dataframe(email_df, '#Sender', 'Recipient', edge_attr = 'time') 

Vous ne pouvez avoir un bord défini pour une paire de noeuds - vous pouvez grouper la trame de données avant de construire votre réseau et utiliser le compte que les poids pour les bords,

edge_groups = email_df.groupby(["#Sender", "Recipient"], as_index=False).count().rename(columns={"time":"weight"}) 
email = nx.from_pandas_dataframe(edge_groups, '#Sender', 'Recipient', edge_attr = 'weight') 
+0

Merci pour votre réponse. Votre explication de mon code est correcte, mais je n'ai pas l'intention d'inclure uniquement l'heure de la dernière ligne en tant qu'attribut 'time' entre une paire donnée d'expéditeur et de destinataire en tant qu'attribut. Comment puis-je récupérer ces "bords" manquants? –

+0

Vous ne pouvez avoir qu'une seule arête définie entre deux nœuds - J'ai ajouté un exemple à ma réponse d'une façon que vous pourriez intégrer les données manquantes. –

+0

Salut, j'ai essayé votre code, mais Python a encore renvoyé une longueur de 3251. –