2017-06-16 4 views
1

Supposons que j'ai un dataframe de pandas géants comme ceci:Python: Trouver des liens communs entre les lignes Pandas dataframe

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

"Texte" est une liste de chaînes. Je cherche un moyen de trouver les liens entre les lignes basées sur le texte, tels que ID 12 et 14 ont Apple en commun.

Donc ce que je voudrais idéalement avoir est:

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

Ce que j'ai essayé jusqu'à présent: Itération à travers chaque élément de chaque liste et de faire un dictionnaire comme ceci:

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

Cependant , puisque les données sont assez grandes, cela prend beaucoup de temps. Je suis à la recherche d'un moyen optimisé pour ce faire. Toutes les pensées et/ou l'aide sont appréciées.

Répondre

0

Vous pouvez effectuer des calculs mathématiques. Au lieu de répéter l'itération à travers chaque élément de chaque liste, vous pouvez trouver l'union des ensembles. `` ` seta = {1,2,3}

setb = {3,4,5}

si seta intersection setb:

log it somewhere as a tuple 

autrement:

skip it. 

`` ` Ceci est O (n^2). Je ne sais pas comment cela se compare à votre solution actuelle. Esprit le partage?

+0

Ma solution actuelle est vraiment simple, je pousse des éléments dans le dictionnaire avec leurs identifiants ("Link"), comme des tuples, et je vérifie s'ils sont déjà là. Dans lequel cas, je ajoute l'ID à la liste - "Lien". La complexité temporelle serait O (n^2) dans le nombre d'éléments. – Kirtiman

+0

Je ne comprends pas bien votre solution, voulez-vous dire que je devrais faire de chaque liste "Texte" une intersection et vérifier les intersections entre cela et le reste? Mais cela semble être O (n^2) dans le nombre de rangées! – Kirtiman