2017-06-16 2 views
1

Angenommen, ich habe einen Pandas Datenrahmen wie so:Python: Die Suche nach gemeinsamen Verbindungen zwischen Pandas Dataframe Reihen

ID     Text 
12    [Apple, Zebra] 
14    [Camel, Apple] 
18    [Obama, Trump] 
20    [Lincoln, Obama, Trump] 
15    [Apple, Banana, Zebra] 

"Text" eine Liste von Strings ist. Ich bin auf der Suche nach einer Möglichkeit, die Links zwischen Zeilen basierend auf Text zu finden, wie ID 12 und 14 Apple gemeinsam haben.

Also, was ich würde im Idealfall haben möchte ist:

ID   Text   Link 
12  [Apple]    [14] 
12  [Apple, Zebra]  [15] 
18  [Obama, Trump]  [20] 

Was ich bisher versucht: durch jedes Element jeder Liste iterieren und ein Wörterbuch wie so machen:

{ 'Apple' : [12, 14], 'Obama' : [18, 20], 'Trump' : [18, 20], 'Zebra' : [12, 15], 'Camel' : [14], 'Lincoln' : [20], 'Banana' : [15] } 

jedoch Da die Daten ziemlich groß sind, benötigt dies viel Zeit. Ich bin auf der Suche nach einer geschwindigkeitsoptimierten Lösung. Irgendwelche Gedanken und/oder Hilfe werden geschätzt.

Antwort

0

Sie können Mathe einstellen. Statt Iteration durch jedes Element jeder Liste zu durchlaufen, können Sie die Vereinigung von Mengen finden. `` ` seta = {1,2,3}

setb = {3,4,5}

wenn seta Kreuzung setb:

log it somewhere as a tuple 

sonst:

skip it. 

`` ` Dies ist O (n^2). Ich bin nicht sicher, wie es mit Ihrer aktuellen Lösung verglichen wird. Mind teilen es?

+0

Meine aktuelle Lösung ist eigentlich ganz einfach, ich schiebe Elemente mit ihren IDs ("Link") als Tupel in das Wörterbuch und prüfe, ob sie schon da sind. In welchem ​​Fall füge ich die ID zur Liste hinzu - "Link". Die Zeitkomplexität wäre O (n^2) in der Anzahl der Elemente. – Kirtiman

+0

Ich verstehe Ihre Lösung nicht vollständig, meinst du, ich sollte jede "Text" -Liste als eine Kreuzung machen und nach Überschneidungen zwischen diesem und dem Rest suchen? Aber das scheint O (n^2) in der Anzahl der Reihen zu sein! – Kirtiman