2017-09-15 1 views
0

Ich versuche, eine Tabelle aus einer dataframe in python, die die Gesamtzahl der gemeinsamen Häufigkeiten von Wörtern zwischen zwei bestimmten Kategorien zeigt. Um dies zu tun, habe ich zuerst eine default dict gebaut, die jede Kategorie als key und die Liste der Wörter, die zu dieser Kategorie gehören, an der value enthält.Kreuzung von Werten in verschiedenen Kombinationen von mehreren Wörterbüchern (Standard dicts)

Jetzt muss ich für jede Kombination von zwei categories Build eine Tabelle, die die Gemeinsamkeiten für eine endgültige gewünschte Ergebnistabelle wie demonstriert:

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

Die Beispieldaten, die ich mit als arbeite:

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 

Der Arbeits Code, den ich verwende ist:

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 

die oben Nachdem ausgeführt wird: das Ergebnis default dict (vor intersection) ist die

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

versuchen, dieses Problem folgende Forschung, I über die following solution kamen:, , die ein Schritt in der richtigen Richtung ist, wie es ist, zu zählen und Gruppieren von Werten nach Schlüsseln in mehreren Tabellen, wobei jedoch die Vereinigung von Werten zwischen jeder Tastenkombination des Diktats nicht berücksichtigt wird.

Ich habe auch einige Lösungen für die Suche nach passenden Schlüsseln oder Werten, aber die Mehrheit von ihnen, wie HERE, nur mit Instanzen von zwei Wörterbüchern und nicht mehrere Wörterbücher beschäftigen.

So bin ich immer noch darin stecken, wie man die Summe der gemeinsamen Elemente zwischen jeder Kombination von Schlüsseln innerhalb MEHRERER dicts zählt und summiert.

Antwort

1

Ich habe ein Wörterbuch erforderlich gemacht, können Sie die Daten in eine Tabelle formatieren: die & Operator für Kreuzung verwenden, das ist genau das, was Sie brauchen: -

>>> 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

Sie für Ihre Lösung danken. Es funktioniert noch bei näherer Betrachtung bemerkte ich einen Fehler, den ich nicht verstehen kann, warum es aus Ihrem Code passiert. Wenn Sie Ihren Code auf einem größeren Dataset mit 22 Schlüsseln, Werten, verwenden, gibt das Wörterbuch 'res' ein Ergebnis zurück, wobei {('A', 'B'): x}! = {('B', 'A'): x } Irgendwelche Ideen warum? – owwoow14

+0

Können Sie den Datensatz und das Ergebnis teilen? Damit kann ich den Fehler neu erstellen. –

+0

Es war korrekt. Es war eine spätere Manipulation meines "Datenrahmens", die korrekt war. Antwort angenommen. – owwoow14

Verwandte Themen