遍历DataFrame时避免未定义错误

时间:2019-01-17 15:15:01

标签: python dictionary dataframe

我找到了解决问题的方法,但是我敢肯定有更好的方法。我正在尝试通过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吗?非常感谢你!

1 个答案:

答案 0 :(得分:0)

这听起来实际上是对的。我不确定您为什么会期望{1:4, 18:2},因为您实际上是在比较(1, 2), (2, 3), (3,4)...上的值,您看到的是1到4之间只有3个计数。同样在您的示例中,您最终会得到{ {1}},因为{1:3, 15:1}不会在上一次迭代之前进行更新。

解决此问题的一种方法是:

  1. x开始默认字典,因为每次计数时,值的数量至少为2,因此1始终至少为2。
  2. 将else子句更改为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} 更好的方法,但是此刻正在逃避我。