2016-12-30 86 views
-1

后空我有一个DataFrame,看起来像这样:Python字典是循环

v1 v2 v3 
    a b  a,b 
    b a  b,a 
    c a  c,a 

我试图遍历V3列创建计数唯一的字符串组合的字典。在循环中,我需要检查现有的组合和反向组合,将它们计数为相同的(即a,bb,a相同)。

这里是我的代码:

import pandas as pd 
df = pd.read_excel("filename.xlsx") 

combine_count = {} 
col = df['v3'] 
for entry in col: 
    if entry in combine_count.keys(): 
     combine_count[entry] += 1 
    elif entry not in combine_count.keys(): 
     reverse = ','.join(entry.split(',')[::-1]) 
     if reverse in combine_count.keys(): 
      combine_count[entry] += 1 
    else: 
     combine_count[entry] = 1 

输出print(combine_count)后是一个空的字典{}。我如何收集正确的密钥和值?

+3

发布的代码是否缩进与您运行的相同? –

+0

代码甚至不运行 - “else”的缩进非常重要! –

+0

*(假设您在实际代码中的缩进是正确的)*您需要在代码中放置一些打印语句以进行调试。我可以告诉你的是,没有'else'的'if'语句之一失败 –

回答

2

为什么不使用collections.Counterfrozenset

>>> from collections import Counter 
>>> cnts = Counter(frozenset(item.split(',')) for item in df['v3']) 
>>> cnts 
Counter({frozenset({'a', 'b'}): 2, frozenset({'a', 'c'}): 1}) 

一个Counter可用于像任何字典和frozenset需要照顾的顺序并不重要,只是内容。

你也可以将此转换回一个普通的字典,字符串键:

>>> {','.join(sorted(key)): count for key, count in cnts.items()} 
{'a,b': 2, 'a,c': 1} 
1

两个逻辑问题,在您的代码来解决。 1)最后的else语句没有正确缩进,在原始代码中它永远不会被执行,因为ifelif涵盖了所有可能的情况(密钥可以在字典中或不在字典中); 2)如果reversecombine_count.keys()您应该添加一个到reverse,因为entry不在字典中,而是在reverse

combine_count = {} 
col = df['v3'] 
for entry in col: 
    if entry in combine_count.keys(): 
     combine_count[entry] += 1 

    elif entry not in combine_count.keys(): 
     reverse = ','.join(entry.split(',')[::-1]) 

     if reverse in combine_count.keys(): 
      combine_count[reverse] += 1   # entry to reverse 

     else:         # indentation here 
      combine_count[entry] = 1 

dict(combine_count) 
# {'a,b': 2, 'c,a': 1} 

此外,因为使用的是pandas,这里是另一个pandas/numpy方法:

import numpy as np 
import pandas as pd 

# here use maximum and minimum to sort your key before doing any count 
(np.minimum(df.v1, df.v2) + "," + np.maximum(df.v1, df.v2)).value_counts().to_dict() 

# {'a,b': 2, 'a,c': 1} 
0

你在找什么,我相信是这样的:

import pandas as pd 
df = pd.read_excel("filename.xlsx") 

combine_count = {} 
col = df['v3'] 
for entry in col: 
    if col[entry] in combine_count.keys(): 
     combine_count[col[entry]] += 1 
    elif col[entry] not in combine_count.keys(): 
     reverse = ','.join(col[entry].split(',')[::-1]) 
     if reverse in combine_count.keys(): 
      combine_count[reverse] += 1 
     else:   
      combine_count[col[entry]] = 1 

什么你想要做的是检查是否存在value,比如说例如,而不是key。为了比较,key是无关紧要的,至少据我了解你的意图。因此,而不是检查entry,您希望检查col[entry]

修复了这个问题,并使用正确的缩进代码,正如我在这里所说明的那样,您应该很好。这会将每个值(包括任何镜像图像)和每个值的计数返回为字典。

要收集密钥,可以使用此字典中的值创建一个列表,例如col中与该值关联的所有密钥。