2017-09-15 146 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