为什么在for循环范围内出现Key错误?

时间:2018-10-12 00:27:04

标签: python pandas for-loop dataframe range

我正在尝试删除Pandas数据框中所有两列中都不为零的行。我的数据帧的索引从0到620。这是我的代码:

for index in range(0, 621):
    if((zeroes[index,1] != 0) and (zeroes[index,3] != 0)):
        del(zeroes[index,])

我一直遇到关键错误。 KeyError:(0,1)

我的教练建议我更改范围以进行测试,以查看数据框中是否有不良行。是的我检查了数据框的尾部,然后将范围更改为(616,621)。然后我得到了关键错误:(616,1)。

有人知道我的代码出了什么问题或为什么我遇到了关键错误吗?

此代码还会产生(0,1)的键错误:

index = 0
while (index < 621):
    if((zeroes[index,1] != 0) and (zeroes[index,3] != 0)):
        del(zeroes[index,])
index = index + 1

1 个答案:

答案 0 :(得分:1)

在此不要使用手动的for循环。您发生错误的原因可能是df.__getitem__((x, y))(实际上是df[x, y]所称的df = df[df.iloc[:, [1, 3]].eq(0).any(1)] 没有意义)。

相反,请使用向量化操作和布尔索引。例如,要删除第1列或第3列不等于0的行:

#if (__x86_64__ || __ppc64__)
    inline bool WideCAS(fat_pointer_rec<T> &old_value, 
        fat_pointer_rec<T> &new_value, std::memory_order morder) {
        bool ret;
        __asm__ __volatile__(
        "lock cmpxchg16b %1;\n"
        "sete %0;\n"
        :"=m"(ret),"+m" (*(volatile fat_pointer_rec<T> *) (&fat_p))
        :"a" (old_value.ptr), "d" (old_value.tag), "b" (new_value.ptr), "c" (new_value.tag));
        std::atomic_thread_fence(morder);
        return ret;
    }
#else
    inline bool WideCAS(fat_pointer_rec<T> &old_value, 
        fat_pointer_rec<T> &new_value, std::memory_order morder) {
        errexit("WCAS not supported with -m32.");
    }
#endif