在iterrows()时从DataFrame读取的值错误

时间:2015-12-09 14:10:14

标签: python python-2.7 pandas scikit-learn dataframe

我已经构建了一个表示层次结构的数据框。现在我试图迭代地遍历这个数据帧(迭代虽然不好但我认为只适用于我的情况)根据我的程序计算更改数据帧的值并删除行。

对于前两次迭代,程序正确读取数据帧行。然而,在第三次迭代(总是)中,它正在读取我认为的旧值。

如果我还不够清楚,这里是ipython笔记本:Ipython Notebook

初始数据框:

        c1   c2  c3    c4
   19   21   20  14  0.718004
   18   20   21  14  0.749271
   17   19   18  17  0.724873
   16   18   19  17  0.647143
   15   17   16  11  0.348749
   14   16   17  11  0.847751
   13   15   14   9  0.597245
   12   14   15   9  0.596115
   11   13   12   8  0.549009
   10   12   13   8  0.810719
    9    11   10   7  0.328420
    8    10   11   7  0.859816
    7     9    8   6  0.449287
    6     8    9   6  0.724799
    5     7    6   4  0.320076
    4     6    7   4  0.306391
    3     5    4   2  0.809620
    2     4    5   2  0.450804
    1     3    2   1  0.771699
    0     2    3   1  0.118202

有问题的代码:

computed_dataframe.sort_values(['c1'], ascending=0, inplace = True)
for index, row in computed_dataframe.iterrows():
    print computed_dataframe
    print row['c3']
    if row['c3'] == 1:
        break
    select_final(row['c3'])
    print computed_dataframe

功能定义

def select_final(check_label): 
.....
.....
    parent_frame = computed_dataframe[computed_dataframe['c1'] == check_label]

    parent_score = get_parent_row_frame.iloc[0]['c4']
    if avg > parent_score:
        for i in child_index:
           computed_dataframe.loc[i,'c2'] = parent_row_frame.iloc[0]['c3']
     computed_dataframe = computed_dataframe[computed_dataframe.c1 != parent_frame.iloc[0]['c1']]
    elif avg <= parent_score:
     computed_dataframe = computed_dataframe[computed_dataframe.c3 != check_label]

return

迭代1:行['c3']指向14

第一次迭代产生的帧:

        c1   c2  c3    c4
   19   21   20  9  0.718004
   18   20   21  9  0.749271
   17   19   18  17  0.724873
   16   18   19  17  0.647143
   15   17   16  11  0.348749
   14   16   17  11  0.847751
   13   15   14   9  0.597245
   # Deleted with c1 = 14 
   11   13   12   8  0.549009
   10   12   13   8  0.810719
   ......
   ......

迭代2:读取索引18. row ['c3']指向9

第二次迭代产生的帧:

        c1   c2  c3    c4
   19   21   20  6  0.718004
   18   20   21  6  0.749271
   17   19   18  17  0.724873
   16   18   19  17  0.647143
   15   17   16  11  0.348749
   .....
   # Deleted row with c1 = 9 
   .........

迭代3:读取索引17. row ['c3']指向17

第3次迭代产生的帧:

        c1   c2  c3    c4
   19   21   20  6  0.718004
   18   20   21  6  0.749271
   17   19   18  11  0.724873
   16   18   19  11  0.647143
   #Deleted row with c1 17
   14   16   17  11  0.8477
   .....
   ..... 
   .........

迭代4:读取索引16. row ['c3']指向11.

然而,程序仍在以某种方式读取行['c3']为然后在执行函数时遇到错误,因为它在c1中找不到对应于17的任何匹配因此,我的计算结果是零误差除。我无法理解它仍在将c3读为17的位置。打印的数据框显示该索引处的更新值为11。

有人会帮我解决这个错误,并从弹出的地方出来吗?

1 个答案:

答案 0 :(得分:0)

这是我的错。我正在更新我正在迭代的相同数据帧。