2017-09-15 128 views
0

我試圖從python中的dataframe構建表格,該表格顯示兩個特定類別之間的單詞的共同頻率總數。 爲了做到這一點,我創建了第一個default dict,其中包含每個類別key以及與value相關的單詞列表。多個詞典的不同組合中的值的交集(默認詞典)

現在,我需要兩個categories構建演示爲最終所需的結果表的共性,如表中的每一個組合:

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

,我一起工作的樣本數據是:

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 

,我使用的工作代碼爲:

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 

運行在上述過程之後:結果default dict(前intersection)爲以下

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

試圖研究這個問題,我橫跨following solution傳來:, 這是在正確方向上的步驟,因爲它是計數並按照多重詞典中的鍵對值進行分組,但是它沒有考慮字典的每個鍵 之間的值的並集。

我也研究過一些尋找匹配鍵或值的解決方案,但其中的大多數(如HERE)僅處理兩個詞典的實例而不處理多個詞典。因此,我仍然停留在如何計算和總結多個字符中每個鍵組合之間的共同元素的總數。

回答

1

我已經作出所需的字典,你可以將其數據以表格形式呈現: 使用&運營商交集,這正是你需要的東西: -

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

謝謝您的解決方案。它在更仔細的檢查後仍然有效,我注意到一個錯誤,我不明白爲什麼它發生在你的代碼中。當使用22個鍵值的較大數據集上使用代碼時,字典'res'返回{('A','B'):x}!= {('B','A'):x }任何想法爲什麼? – owwoow14

+0

你能分享數據集和結果嗎?這樣我可以重新創建錯誤。 –

+0

這是正確的。這是我的'dataframe'的後來處理是正確的。接受答案。 – owwoow14