我在熊猫df.tail()中发现错误或错误了吗?

时间:2018-11-28 02:57:06

标签: python python-3.x pandas

好,我有一个奇怪的人。我可能发现了一个错误,但让我们假设我首先犯了一个错误。无论如何,我遇到了一些熊猫问题。

我想找到数据帧的最后两列以比较列'Col'的值。我在for循环内运行代码,因为它需要在文件夹中的所有文件上运行。这段代码:

import pandas

for item in itemList:
    df = df[['Col']].tail(2)
    valA = df.iloc[1]['Col']
    valB = df.iloc[0]['Col']

主要工作。我运行了1040个数据帧,没有任何问题。然后在大约2000的1041处会导致此错误:

Traceback (most recent call last):
  File "/path/to/script.py", line 206, in <module>
    valA = df.iloc[1]['Col']
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/core/indexing.py", line 1373, in __getitem__
return self._getitem_axis(maybe_callable, axis=axis)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/core/indexing.py", line 1830, in _getitem_axis
    self._is_valid_integer(key, axis)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/core/indexing.py", line 1713, in _is_valid_integer
    raise IndexError("single positional indexer is out-of-bounds")
IndexError: single positional indexer is out-of-bounds

据此,我认为数据帧可能太短。应该不应该,我在其他地方对此进行了测试,但是好的,会发生错误,所以让我们print(df)来解决这个问题。 如果我在分配print(df)之前.tail(2)是这样的:

print(df)
df = df[['Col']].tail(2)
valA = df.iloc[1]['Col']
valB = df.iloc[0]['Col']

我看到一个37行的数据框。在我的世界中,> 37> 2.

现在,让我们像这样将print(df)向下移动一行:

df = df[['Col']].tail(2)
print(df)

输出通常是两行,如预期的那样。但是,发生错误时,df.tail(2)返回具有37行的数据帧中的单行数据帧。不是两排,而是一排。但是,这仅在循环中的一项发生。所有其他人都很好。如果我这样手动跳过项目:

for item in itemList:
    if item == 'troublemaker':
        continue

...脚本一直运行到最后。没有错误发生。

我必须补充一点,我对这一切还是陌生的,所以我可能会完全忽略某些东西。是吗建议表示赞赏。谢谢。

编辑:这是发生错误时print(df)的输出

                Col       
Date                  
2018-11-30        True

以及在所有其他情况下:

                Col       
Date
2018-10-31       False
2018-11-30        True

2 个答案:

答案 0 :(得分:1)

我不认为这是一个错误,因为它在2000年仅发生在一个df上。您能显示该df吗? 我也认为您不需要尾巴,您尝试过吗

valA = df.iloc[-2]['Col']
valB = df.iloc[-1]['Col']

获取最后的值。

答案 1 :(得分:1)

由于它没有第二个索引,因此为什么返回错误,请尝试对样本df,tail和{{使用headvalA,请注意这一点。 1}}将具有相同的值

valB