Странная неподдерживаемая ошибка операции в простом цикле по кадру данных

Я работаю над кадром данных и хочу перебрать один столбец, как я делал это сотни раз со многими кадрами данных. Сегодня я получаю ошибку, и я не могу понять, что с ней не так. Возможно, стоит упомянуть, что фрейм данных представляет собой конкатенацию.

log = (pd.concat([log_entry,log_exit]).sort_values(by=['date']))

фрейм данных:

                    position order  price       PnL
date                
2022-03-27 20:45:00 short   entry   29.242291   0
2022-03-28 13:45:00 short   entry   31.052375   0
2022-03-28 15:00:00 short   entry   31.072893   0
2022-03-28 19:15:00 short   entry   31.070073   0
2022-03-28 20:45:00 short   entry   31.220069   0
2022-03-28 23:00:00 -          TP   30.016500   0
2022-03-28 23:15:00 -          TP   29.788000   0
2022-03-28 23:15:00 -          TP   29.820500   0
2022-03-28 23:30:00 -          TP   29.640500   0
2022-03-29 05:30:00 short   entry   30.902677   0
2022-03-29 06:15:00 short   entry   30.893078   0

итерация:

for i in range(len(log.index)):
    if log.position[i] == 'short':
            print('ok')

ошибка:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_value(self, series, key)
   4729         try:
-> 4730             return self._engine.get_value(s, k, tz=getattr(series.dtype, "tz", None))
   4731         except KeyError as e1:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine._get_loc_duplicates()

TypeError: '<' not supported between instances of 'str' and 'int'

During handling of the above exception, another exception occurred:

IndexError                                Traceback (most recent call last)
<ipython-input-8-c8832d66a85a> in <module>
    156 
    157 for i in range(len(log.index)):
--> 158     if log.position[i] == 'short':
    159             print('ok')
    160 #         dd_buffer.append(log.price[i])

/opt/anaconda3/lib/python3.7/site-packages/pandas/core/series.py in __getitem__(self, key)
   1066         key = com.apply_if_callable(key, self)
   1067         try:
-> 1068             result = self.index.get_value(self, key)
   1069 
   1070             if not is_scalar(result):

/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_value(self, series, key)
   4748             # python 3
   4749             if is_scalar(key):  # pragma: no cover
-> 4750                 raise IndexError(key)
   4751             raise InvalidIndexError(key)
   4752 

IndexError: 0

Как это возможно??

Чего вы на самом деле хотите достичь? Зацикливание на DataFrame редко бывает хорошим подходом.

mcsoini 09.04.2022 10:55
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
30
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

С помощью log.position[i] вы сопоставляете показатель кадра данных, то есть даты и времени. Нет индекса 0 (только дата и время), поэтому вы получаете IndexError. Вместо этого используйте log.position.iloc[i] для индексации на основе целочисленного местоположения для выбора по позиции.

До сих пор не понимаю, почему обычно это работает всегда, а не сейчас. В том же проекте с другим df я использую «for i in range(len(df.index)): если df.position[i] == «short»» работает нормально

stanvooz 09.04.2022 11:00

Возможно, datetime был не индексом, а столбцом

mcsoini 09.04.2022 11:01

Я всегда использую дату и время в качестве индекса. Но в любом случае это просто целочисленный итератор, использующий range(len()). на самом деле не имеет значения, какой индекс

stanvooz 09.04.2022 11:03

Редактировать: Кажется, теперь я понимаю ваш вопрос: Вы перебираете диапазон (len (index)) который всегда будет начинаться с 0 и повторяться до len(index)-1

ваш индекс не обязательно должен быть последовательным порядком, вы можете, например, удалить свой индекс = 0, и тогда ваш индекс начнется с 1 (вы можете просмотреть его как еще один столбец, который можно просто редактировать)

Пытаться:

for i in log.index:
    print(i)

Это должно показать, что ваш индекс не начинается с 0, если я прав.

for i in log.index:
    if log.position.iloc[i] == "short":
        print("ok")

Это должно делать то, что вы хотели.

Предыдущий ответ( Я не уверен, чего вы пытаетесь достичь, но похоже, что вы хотите знать, сколько "коротких" в позиции

Пытаться: log.position.value_counts()

чтобы увидеть, сколько каждого значения там

Обычно есть лучшие способы, чем перебирать фрейм данных в pandas)

Нет, я не хочу этого. Дело не в том, что происходит позже в цикле, а только в том, почему итерация не работает.

stanvooz 09.04.2022 11:06

Я видел ваш другой комментарий, но не могу ответить на него из-за недостаточной репутации. Вы проверили, как выглядит ваш индекс? это не обязательно должно быть 0,1,2,3, но может быть 1000, 10001, 10003 и т. д., вы перебираете len(index), который всегда будет начинаться с 0. Попробуйте i в log.index

Kay Scheerer 09.04.2022 11:41

Другие вопросы по теме