Нашел ли я ошибку или допустил ошибку в pandas df.tail ()? - PullRequest
0 голосов
/ 28 ноября 2018

Хорошо, у меня есть странный.Возможно, я нашел ошибку, но давайте предположим, что сначала я допустил ошибку.В любом случае, у меня возникают некоторые проблемы с пандами.

Я хочу найти два последних столбца информационного кадра, чтобы сравнить значения столбца 'Col'.Я запускаю код внутри цикла for, потому что он должен выполняться для всех файлов в папке.Этот код:

import pandas

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

Работает в основном.Я запустил 1040 фреймов данных без проблем.Затем в 1041 из 2000 это вызывает эту ошибку:

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 голосов
/ 28 ноября 2018

Поскольку у него нет второго индекса, поэтому верните ошибку, попробуйте использовать 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']
0 голосов
/ 28 ноября 2018

Я не думаю, что это ошибка, поскольку она случается только с одним df в 2000 году. Можете ли вы показать этот df?Я также не думаю, что вам нужен хвост здесь, вы пытались

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

, чтобы получить последние значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...