2016-12-09 4 views
1

zum Rand habe ich einen Datenrahmen, die eine Zugehörigkeit Matrix ähnelt. Ich habe eine Person, eine Veranstaltung und das Jahr der Veranstaltung.Attribut hinzufügen in projizierten Graph

d = {'person' : ['1', '2', '3', '1', '4', '3', '4', '1', '2'], 
    'event' : ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'D', 'D'], 
    'year' : [1995, 1995, 1995, 1996, 1996, 2000, 2000, 2001, 2001]} 

df = pd.DataFrame(d) 

Ich brauche das erste Treffen zwischen zwei Personen zu bekommen. Das heißt, wenn ‚1‘ und ‚2‘ auf Ereignisse erfüllt ‚A‘ und ‚D‘, muß ich wissen, wenn sie zum ersten Mal treffen (in diesem Beispiel war es in ‚A‘ im Jahr 1995).

Ich weiß nicht, ob dies möglich ist NetworkX verwenden oder wenn ich es auf andere Weise mit Pandas tun müssen. Wie kann ich das machen?

ich auf das geplante Netzwerk erhalten kann, aber ich weiß nicht, wie das Attribut ‚Jahr‘ des projizierten Netzwerkes an die Kanten zu übertragen. Es ist wichtig zu beachten, dass das Attribut (‚Jahr‘ in diesem Fall) ein Attribut der Veranstaltung ist es, so dass es für alle Kanten eines jeden Ereignisses konstant ist. Diese

ist das, was ich bisher:

import networkx as nx 
import pandas as pd 

d = {'person' : ['1', '2', '3', '1', '4', '3', '4', '1', '2'], 
    'event' : ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'D', 'D'], 
    'year' : [1995, 1995, 1995, 1996, 1996, 2000, 2000, 2001, 2001]} 

df = pd.DataFrame(d) 

B = nx.from_pandas_dataframe(df, 'person', 'event', edge_attr='year') 

G = nx.bipartite.projected_graph(B, df.person.unique(), multigraph = True) 
+0

Ich korrigierte einen Fehler in meiner ursprünglichen Antwort. Ich sortiere an der falschen Stelle, aber es sollte jetzt gut sein. Lassen Sie es mich wissen, wenn das nicht zu Ihrem Anwendungsfall passt. – 3novak

+0

@ 3novak Vielen Dank! Es läuft gut. Ich frage mich, wie sich das in einem großen Datensatz auswirken wird. Ich habe einen Weg geschaffen, Mergen statt Iterieren. Vielleicht kann ich die Frage so umformulieren, dass sie mit Ihrer Antwort gelöst werden kann. Vielleicht können Sie die Bibliotheken hinzufügen, die importiert werden müssen. – frmo

+0

Guter Punkt, @frmo. Ich habe die Import-Anweisung der itertools-Bibliothek hinzugefügt. Können Sie Ihre Merging-Lösung teilen? Ich bin gespannt wie es funktioniert. Können Sie mir erklären, was Sie damit meinen, die Frage neu zu formulieren, damit sie mit der von mir vorgeschlagenen Methode gelöst werden kann? – 3novak

Antwort

0

Ich bin nicht vertraut genug mit NetworkX Ihnen mit dem Problem der Zugabe von Kante zu helfen Attribute, aber diese Methode hat das erste Treffen von Personen zu identifizieren.

import pandas as pd 
import itertools 

# initial data 
d = {'person' : ['1', '2', '3', '1', '4', '3', '4', '1', '2'], 
    'event' : ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'D', 'D'], 
    'year' : [1995, 1995, 1995, 1996, 1996, 2000, 2000, 2001, 2001]} 

df = pd.DataFrame(d) 

# create a unique list of individuals for each meeting. this should be 
# unique anyway, but just in case. :) 
# note that this approach is also robust to events in different years 
# sharing the same name. 

grpd = df.groupby(['year', 'event'])['person'].unique().apply(lambda x: sorted(x)) 

# sort based on the year from the oldest meetings to the most recent 
grpd.sort_index(ascending=False, inplace=True) 

# we'll add meetings to a dictionary and overwrite as encounter more 
# recent meetings 

meetings = {} 

for idx in range(len(grpd)): 
    year = grpd.index[idx][0] 
    meeting = grpd.index[idx][1] 
    for combo in itertools.combinations(grpd[idx], 2): 
     meetings[combo] = (meeting, year) 


import pprint 

>>> pprint.pprint(meetings) 
{('1', '2'): ('A', 1995), 
('1', '3'): ('A', 1995), 
('1', '4'): ('B', 1996), 
('2', '3'): ('A', 1995), 
('3', '4'): ('C', 2000) 
Verwandte Themen