循环后Python字典为空
我有一个如下所示的数据帧:循环后Python字典为空,python,loops,dictionary,Python,Loops,Dictionary,我有一个如下所示的数据帧: v1 v2 v3 a b a,b b a b,a c a c,a 我试图遍历v3列以创建一个统计唯一字符串组合的字典。在循环中,我需要检查现有的组合和反向组合,以将它们计算为相同的组合,即a,b与b,a相同 以下是我的代码: import pandas as pd df = pd.read_excel("filename.xlsx") combine_count = {} col
v1 v2 v3
a b a,b
b a b,a
c a c,a
我试图遍历v3列以创建一个统计唯一字符串组合的字典。在循环中,我需要检查现有的组合和反向组合,以将它们计算为相同的组合,即a,b与b,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
printcombine_count之后的输出是一个空字典{}。如何收集正确的键和值?为什么不使用和:
计数器可以像任何字典一样使用,而frozenset会注意顺序不重要,只关注内容
您还可以将其转换回具有字符串键的普通词典:
>>> {','.join(sorted(key)): count for key, count in cnts.items()}
{'a,b': 2, 'a,c': 1}
要在代码中修复的两个逻辑问题。1最后一个else语句没有正确缩进,在您的原始代码中它将永远不会执行,因为if和elif涵盖了所有可能的情况,一个键可以在字典中,也可以不在字典中;2如果在combine_count.keys中反转,则应添加一个以反转,因为条目不在字典中,而是在反转中 除此之外,由于您正在使用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}
我相信,你在寻找的是:
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
您要做的是检查是否存在值,例如a、b,而不是键。为了便于比较,关键是不相关的,至少就我理解你的意图而言。因此,您需要检查col[entry],而不是检查条目
解决了这个问题,代码使用了正确的缩进,正如我在这里演示的那样,您应该可以开始了。这将以字典的形式返回每个值(包括所有镜像)和每个值的计数
要收集键,可以使用此字典中的值创建一个列表,例如,列中与该值关联的所有键。发布的代码缩进是否与运行的代码相同?代码甚至不运行-ELSE的缩进有点重要!假设您在实际代码中的缩进是正确的,您需要在代码中放入一些print语句来调试它。我可以告诉您的是,您的if语句中有一条没有其他语句失败,您无法通过不在combine\u count中的elif条目。键:。由于这种情况为真,但如果combine_count.keys:中的reverse为假,则不会向字典中添加任何内容。您需要将Else子句缩进一级。COUNMIE\u count.keys中的条目为true或COUNMIE\u count.keys中的条目不为true,但两个条件都不为false,因此永远不会到达您的Else。正因为如此,你从不在联合计数中输入任何内容
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}
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