IndexError: одиночный позиционный индексатор находится вне пределов и если условие - PullRequest
0 голосов
/ 31 мая 2018

У меня есть кадр данных, который выглядит следующим образом:

    Repo
    Out[624]: 

1             Instrument    Term Code  WTD Rate
2    GC_AUSTRIA_SUB_10YR          T-N     -0.49
3    GC_AUSTRIA_SUB_10YR            O -0.467643
4      R_RAGB_1.15_10/18          S-N -0.520299
5      R_RAGB_4.35_03/19          S-N -0.497759
6      R_RAGB_4.35_03/19          T-N      -0.5
7      R_RAGB_1.95_06/19          S-N -0.501478
8      R_RAGB_0.25_10/19          S-N -0.497765

У меня есть условие if, которое зависит от столбца «Инструмент»

if condition:
   return Repo.loc[(Repo['Instrument']=='GC_LCH_BELGIUM') & (Repo['Term Code']=='T-N'),'WTD Rate'].iloc[0]

Проблема заключается в том, что инструментиногда имя не существует и выдается ошибка IndexError: single positional indexer is out-of-bounds

Как я могу сказать в условии «если», что если инструмент существует (или если есть ошибка) возвращается к значению по умолчанию, скажем, 10.

Я должен отметить, что когда Инструмент не существует, в кадре данных нет ни одной строки.поэтому код, который выглядит как «пусто», не будет работать

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Вы можете использовать next и предоставить аргумент по умолчанию 10:

if condition:
    mask = (Repo['Instrument']=='GC_LCH_BELGIUM') & (Repo['Term Code']=='T-N')
    s = Repo.loc[mask, 'WTD']
    return next(iter(s), 10)

Внутренне это работает, вызывая ошибку StopIteration, когда серия пуста и возвращаясь к значению по умолчанию.

0 голосов
/ 31 мая 2018

Поскольку существует вероятность того, что условие внутри средства доступа не будет выполнено, вы всегда можете выбрать try и except, т. Е.

if condition :
    try:
       return Repo.loc[(Repo['Instrument']=='GC_LCH_BELGIUM')&(Repo['Term Code']=='T-N'),'WTD Rate'].iloc[0]
    except IndexError:
       return 10
0 голосов
/ 31 мая 2018

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

Поэтому необходимо проверить, если empty с if-else:

if condition:
   a =  Repo.loc[(Repo['Instrument']=='GC_LCH_BELGIUM')&(Repo['Term Code']=='T-N'),'WTD Rate']
   return 'empty' if a.empty else a.iloc[0]
...