2017-09-15 12 views
0

J'essaie de construire une table à partir d'un dataframe en python qui montre le total des fréquences communes de mots entre deux catégories particulières. Pour ce faire, j'ai d'abord construit un default dict qui contient chaque catégorie comme key et la liste des mots qui se rapportent à cette catégorie au value.Intersection de valeurs dans différentes combinaisons de plusieurs dictionnaires (dicts par défaut)

Maintenant, je dois pour chaque combinaison de deux categories construire une table qui montre les points communs pour une table de résultat final souhaité, tels que:

A B C 
A 10 2 1 
B 2 5 2 
C 1 2 3 

Les données de l'échantillon que je travaille avec est comme:

Cat Item 
A dog 
A cat 
A bear 
A fish 
A monkey 
A tiger 
A lion 
A rabbit 
A horse 
A turtle 
B dog 
B cat 
B flower 
B plant 
B bush 
C dog 
C flower 
C plant 

Le code de travail que j'utilise est:

import pandas as pd 
import numpy as np 
from collections import defaultdict 


inFile = '\path\to\infile.csv' 

data = pd.read_csv(inFile, sep='\t') 
dicts = defaultdict(list) 

for i, j in zip(data['Cat'],data['Item']): 
    dicts[i].append(j) 


for k,v in dicts.iteritems(): 
    set1 = set(v) 
    set2 = set(v) 
    for k in set1.intersection(set2): 
     print k,v 

Après l'exécution de ce qui précède: le résultat default dict (avant intersection) est la suivante

{'A':['dog','cat','bear','fish','monkey','tiger','lion','rabbit','horse','turtle'],'B':['dog','cat','flower','plant','bush'],'C':['dog','flower','plant']} 

Essayer de recherche ce problème, je suis tombé sur le following solution:, qui est un pas dans la bonne direction, car elle compte et regrouper les valeurs en fonction des clés dans plusieurs dics, cependant il ne prend pas en compte l'union des valeurs entre chaque combinaison de touches de la dict. J'ai également examiné certaines solutions pour trouver des clés ou des valeurs correspondantes, mais la majorité d'entre elles, telles que HERE, ne traitent que des instances de deux dictionnaires et non de plusieurs dictionnaires.

Ainsi, je suis toujours coincé dans la façon de compter et de totaliser le total des éléments communs entre chaque combinaison de touches dans plusieurs dicts.

Répondre

1

J'ai fait un dictionnaire nécessaire, vous pouvez formater ses données dans une table: Utilisez l'opérateur pour & intersection, c'est exactement ce dont vous avez besoin: -

>>> dicts = {'A':['dog','cat','bear','fish','monkey','tiger','lion','rabbit','horse','turtle'],'B':['dog','cat','flower','plant','bush'],'C':['dog','flower','plant']} 
>>> dicts.items() 
[('A', ['dog', 'cat', 'bear', 'fish', 'monkey', 'tiger', 'lion', 'rabbit', 'horse', 'turtle']), ('C', ['dog', 'flower', 'plant']), ('B', ['dog', 'cat', 'flower', 'plant', 'bush'])] 
>>> dicts = {'A':['dog','cat','bear','fish','monkey','tiger','lion','rabbit','horse','turtle'],'B':['dog','cat','flower','plant','bush'],'C':['dog','flower','plant']} 
>>> items = sorted(dicts.items()) 
>>> res = {} 
>>> for i in range(len(items)) : 
...  for j in range(i,len(items)) : 
...    res[(items[i][0],items[j][0])] = len(set(items[i][1]) & set(items[j][1])) 
...    res[(items[j][0],items[i][0])] = res[(items[i][0],items[j][0])] 
... 
>>> res 
{('B', 'C'): 3, ('A', 'A'): 10, ('B', 'B'): 5, ('B', 'A'): 2, ('C', 'A'): 1, ('C', 'B'): 3, ('C', 'C'): 3, ('A', 'B'): 2, ('A', 'C'): 1} 
>>> 
+0

Nous vous remercions de votre solution. Cela fonctionne encore en regardant de plus près j'ai remarqué une erreur que je ne peux pas comprendre pourquoi cela arrive de votre code. Lorsque vous exécutez votre code sur un ensemble de données plus grand avec 22 clés, valeurs, le dictionnaire 'res' renvoie un résultat où {('A', 'B'): x}! = {('B', 'A'): x } Des idées pourquoi? – owwoow14

+0

Pouvez-vous partager l'ensemble de données et le résultat? Alors que je peux recréer l'erreur. –

+0

C'était correct. Ce fut une manipulation ultérieure de mon «dataframe» qui était correcte. Réponse acceptée. – owwoow14