我找到了解决问题的方法,但是我敢肯定有更好的方法。我正在尝试通过DataFrame进行迭代,如果迭代中的每个索引都小于下一个索引的2,则最小索引是键,而每个后续索引中小于2的值就是添加到新字典。抱歉,如果没有太大意义,但实际上,如果DataFrame是:
v
1 .15
2 .31
3 .64
4 .15
7 .62
11 .12
15 .39
18 .54
19 .84
那么结果将是
{1:4, 18:2}
要完成此操作,我使用了以下代码:
f_dict = defaultdict(int)
for id1, id2 in zip(df.iterrows(),df_test[1:].iterrows()):
if id2[0] - id1[0] < 2:
f_dict[x] += 1
else:
x = id1[0]
但是,按预期运行此程序时,出现NameError:未定义名称'x'。因此,通过在迭代之前给x一个DataFrame的第一个索引值的值,似乎可以解决问题,但是感觉不太正确。
f_dict = defaultdict(int)
x = df_test.index[0]
for id1, id2 in zip(df_test.iterrows(),df_test[1:].iterrows()):
if id2[0] - id1[0] < 2:
f_dict[x] += 1
else:
x = id1[0]
此代码生成字典-
{1:3, 18:1}
代替
{1:4, 18:2}
因此,我遍历新字典,将每个值加1:
for key in f_dict:
f_dict[key] += 1
最后我找到了想要的东西。对于我要解决此问题的方法不正确,我深表歉意,因为我对python和一般编程还是相当陌生的。有没有更好的方法来解决此问题,而不必在迭代之前设置x的值?不必再遍历新字典并将每个值加1吗?非常感谢你!
答案 0 :(得分:0)
这听起来实际上是对的。我不确定您为什么会期望{1:4, 18:2}
,因为您实际上是在比较(1, 2), (2, 3), (3,4)...
上的值,您看到的是1到4之间只有3个计数。同样在您的示例中,您最终会得到{ {1}},因为{1:3, 15:1}
不会在上一次迭代之前进行更新。
解决此问题的一种方法是:
x
开始默认字典,因为每次计数时,值的数量至少为2,因此1
始终至少为2。f_dict[x] += 1
,以便它使用下一个索引作为起点。因此,更改将如下所示:
x = df2[0]
我觉得可能有比f_dict = defaultdict(lambda: int(1))
x = df_test.index[0]
for id1, id2 in zip(df_test.iterrows(),df_test[1:].iterrows()):
if id2[0] - id1[0] < 2:
f_dict[x] += 1
else:
x = id2[0]
f_dict
# {1:4, 18:2}
更好的方法,但是此刻正在逃避我。