我在代码中发现了一个非常微妙的错误。我经常在分析中删除数据帧中的行。因为这将在索引中留下空白,我尝试通过使用
重置索引来结束所有函数df0 = df0.reset_index (drop = True)
然后我继续使用
进行下一个功能for row in xrange (df0.shape [0]):
print df0.loc [row]
print df0.iloc [row]
但是,如果我没有正确重置索引,第一行的索引可能为192.索引192与行号0不同。这导致df0.loc [row]的问题访问索引为0的行,并且df0.iloc [row]正在访问索引为192的行。这导致了一个非常奇怪的错误,因为我尝试更新第0行,但索引192会更新。反之亦然。
但实际上,我不使用任何df0.loc()或df0.iloc()函数,因为它们太慢了。我的代码充满了df0.get_value(...)和df0.set_value(...)函数,因为它们是访问值时最快的函数。
似乎某些功能是通过索引访问的,而其他功能是通过行号访问的?我很迷惑。有人可以向我解释一下吗?什么是最佳做法?是否有一些函数使用索引访问值,而其他函数使用行号?我误解了什么吗?我应该经常reset_index()吗?或者永远不要那样做?
编辑:回顾一下:我手动合并函数中的某些行,因此指标中会有间隙。在其他函数中,我迭代每一行并进行计算。但是,如果我重置了索引,我得到的其他计算结果比不重置索引要好。为什么?这是我的问题。
答案 0 :(得分:1)
.loc[]
查看索引标签,其可能是整数值,也可能不是整数值。
[0, 1, 3]
(非连续整数索引),.loc[2]
将找不到任何内容,因为没有索引标签2
。['a', 'b', 'c']
(非整数索引),则.loc[2]
将为空。 .iloc[]
查看索引位置,它始终是整数值。
[0, 1, 3]
,.loc[2]
将返回与3
对应的行。['a', 'b', 'c']
,.loc[2]
将返回与'c'
对应的行。这不是一个错误,这就是这些索引器的设计方式。是否符合您的目的取决于您的数据结构以及您要完成的任务。如果不了解更多信息,很难提出建议。
那就是说,听起来你的代码有点棘手。必须在一堆不同的地方执行reset_index()
并不断跟踪您尝试更新的行,这表明您可能无法利用Pandas在多行和多列中执行基于矢量的计算的能力立刻。也许你想要完成的任务使这不可避免。但值得花些时间考虑一下你是否无法对你正在做的事情进行矢量化,这样你就可以将它应用于整个数据帧或数据帧的一个子集,而不是一次一个地对单个单元格进行操作。