Как предотвратить IndexError серии панд во вложенном цикле? - PullRequest
0 голосов
/ 18 июня 2019

У меня есть вложенный цикл.Во внешнем цикле я перебираю БОЛЬШЕ ключей, чем dataframe [key] во внутреннем цикле.Это вызывает ошибку IndexError (ключ не может быть найден в кадре данных [ключ]. Мне нужен способ проверить, совпадают ли ключи.

, например, только ключевые столбцы:

dfKeys                    dataframe
-------                   --------
 key                         key
  1                           1
  1                           3
  3                           5
  3                           9
  3
  4
  4
  5
  5
  5
  5
  8
  8
  9
  9
  9 

grouped=dfKeys.groupby('key')
for key, group in grouped:
    if ((group.someCol=='someVal').any() or ~(group.someCol.isin(someArray).any())):
        if(key in dataframe['key']): #######this did not solve it, always false (but there have to be some matches) 
            foundIndex=dataframe[dataframe['key']==key].index.values.astype(int)[0] #INDEXERROR after some loops if there is no 'if' above
            dataframe.loc[foundIndex,'myCol']='myVal'

Тип dataframe['key'] - это серия панд.

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Не элегантно, но я могу использовать try-кроме

grouped=dfKeys.groupby('key')
for key, group in grouped:
    if ((group.someCol=='someVal').any() or ~(group.someCol.isin(someArray).any())):
        try: 
            foundIndex=dataframe[dataframe['key']==key].index.values.astype(int)[0] 
            dataframe.loc[foundIndex,'myCol']='myVal'
        except IndexError: print('key not found, continue')
0 голосов
/ 18 июня 2019

Если вы просматриваете список, то вы можете проверить, находится ли индекс в пределах длины списка:

if key < len(list):

Если это словарь, вы можете проверить, существует ли ключ:

if key in dict:

Если вы хотите получить ключ от dict, если он существует, и вернуть значение по умолчанию, если его нет, тогда вы можете использовать dict.get():

value = dict.get(key, default)

РЕДАКТИРОВАТЬ:

Согласно документации для pandas.Series, вы можете использовать метод Series.get(), чтобы получить элемент для данного ключа.Как и в случае dict.get(), вы можете указать значение по умолчанию, которое будет возвращаться, если ключ не найден:

if mySeries.get(myKey, 'default') != 'default':
    #This code will only run if it found `myKey` in `mySeries`

Документация pandas.Series:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.html

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.get.html#pandas.Series.get

...