什么时候重置索引? loc vs iloc索引中的空白?最佳做法?

时间:2017-10-19 13:41:25

标签: python pandas

我在代码中发现了一个非常微妙的错误。我经常在分析中删除数据帧中的行。因为这将在索引中留下空白,我尝试通过使用

重置索引来结束所有函数
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()吗?或者永远不要那样做?

编辑:回顾一下:我手动合并函数中的某些行,因此指标中会有间隙。在其他函数中,我迭代每一行并进行计算。但是,如果我重置了索引,我得到的其他计算结果比不重置索引要好。为什么?这是我的问题。

1 个答案:

答案 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在多行和多列中执行基于矢量的计算的能力立刻。也许你想要完成的任务使这不可避免。但值得花些时间考虑一下你是否无法对你正在做的事情进行矢量化,这样你就可以将它应用于整个数据帧或数据帧的一个子集,而不是一次一个地对单个单元格进行操作。