好,我有一个奇怪的人。我可能发现了一个错误,但让我们假设我首先犯了一个错误。无论如何,我遇到了一些熊猫问题。
我想找到数据帧的最后两列以比较列'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
答案 0 :(得分:1)
我不认为这是一个错误,因为它在2000年仅发生在一个df上。您能显示该df吗? 我也认为您不需要尾巴,您尝试过吗
valA = df.iloc[-2]['Col']
valB = df.iloc[-1]['Col']
获取最后的值。
答案 1 :(得分:1)
由于它没有第二个索引,因此为什么返回错误,请尝试对样本df,tail
和{{使用head
和valA
,请注意这一点。 1}}将具有相同的值
valB