好吧,我有一个奇怪的。我可能发现了一个错误,但我们假设我首先犯了一个错误。不管怎样,我在使用 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)
来解决这个问题。
如果我在分配.tail(2)
之前print(df)
,如下所示:
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
最佳答案
由于它没有第二个索引,这就是返回错误的原因,请尝试使用 tail
和 head
,请注意这一点,对于您的示例 df,valA
和 valB
将是相同的值
import pandas
for item in itemList:
df = df[['Col']].tail(2)
valA = df.tail(1)['Col']
valB = df.head(1)['Col']
关于python - 我是否在 pandas df.tail() 中发现了错误或犯了错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53511429/