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

Posted

技术标签:

【中文标题】iterrows() 时从 DataFrame 读取的值错误【英文标题】:Wrong value read from DataFrame while iterrows() 【发布时间】:2016-03-14 20:21:41 【问题描述】:

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

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

以防万一,我还没说清楚,这里是 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:row['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

第三次迭代的结果帧:

        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。

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

有人可以帮我解决这个错误以及它从哪里弹出吗?

【问题讨论】:

【参考方案1】:

这是我的错。我正在更新我正在迭代的同一个数据框。

【讨论】:

以上是关于iterrows() 时从 DataFrame 读取的值错误的主要内容,如果未能解决你的问题,请参考以下文章

iterrows() 函数对dataframe进行遍历

Pandas.DataFrame 的 iterrows()方法详解

DataFrame iterrows() 和 .to_csv:逐行写入

使用 iterrows() 时的持久性问题

pandas iterrows 将整数变为浮点数

从 Pandas 中的 iterrows() 获取行位置而不是行索引