Как продолжать цикл в Python, даже после KeyError - PullRequest
0 голосов
/ 22 сентября 2019

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

Я работаю с Python 3.7 и уже пытался установить некоторый контроль над циклом, но цикл не завершается, потому что первый встреченный пиксель кажется пустым.Я также попытался использовать try: и кроме: KeyError, но в конце я получаю строку, которую не могу изменить, потому что, очевидно, цикл просто пропускает пустые субкадры.Здесь я опишу основные шаги кода, сообщая, что 'lin' и 'col' - это целые числа, которые указывают положение определенной меры в определенном пикселе:

1-я попытка:

mean_val=[]
row=[]

for i in range (0,Ypix):

   for j in range (0,Xpix):

      data_pix = data.groupby(['lin', 'col']).get_group((i,j))[['ref', 'th']]

      if KeyError:
                data_pix = pd.DataFrame()

       else:
                mean_level= data_pix['ref'].mean()  
                row.append(mean_level)

mean_val = np.array(row).reshape(Ypix, Xpix) 

2-я попытка:

mean_val=[]
row = []

for i in range (0,Ypix):

  for j in range (0,Xpix):

      try:
         data_pix=data.groupby(['lin', 'col']).get_group((i,j))[['ref', 'th']]

      except KeyError:
         data_pix = pd.DataFrame()

      else:

         mean_level= data_pix['ref'].mean()  
         row.append(mean_level)

mean_val = np.array(row).reshape(Ypix, Xpix)

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

1-я попытка:

Traceback (most recent call last):
File "grid.py", line 385, in <module>
    proc.process()

File "grid.py", line 106, in process
    data_pix = data.groupby(['lin', 'col']).get_group((i,j))[['ref', 'th']]

File "C:\xxx\yyy\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\core\groupby\groupby.py", line 680, in get_group

  raise KeyError(name)

KeyError: (0, 0)

2-я проверка:

Traceback (most recent call last):
  File "grid.py", line 379, in <module>
    proc.process()

File "grid.py", line 276, in process

   mean_val = np.array(row).reshape(Ypix, Xpix) 

ValueError: cannot reshape array of size 1506 into shape (50,50)

Кто-нибудь может мне помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

Как я полагаю, ваша groupby дает группы для фракции возможных комбинаций i и j (для некоторых комбинаций i / j (соответствующая группа отсутствует).

Тогда только обработка исключений (как предлагается в другом ответе) не будет выполнять эту работу, потому что вы:

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

Мое предложение состоит в том, чтобы вместо сбора данных для всех комбинаций i / j , с обработкой исключений из-за отсутствия определенной группы,Вы должны заполнить каждый элемент промежуточного результата, только для существующих групп.Что-то вроде:

means = data.groupby(['lin', 'col'])['ref'].mean()

В результате получается серия с:

  • a MultiIndex , состоящая из lin и col - пиксельные координаты,
  • значение - означает ref из текущей группы.

Затем перекодируйте эту таблицу в свойтаблица результатов (размером Xpix * Ypix ), заполняющая оставшиеся ячейки некоторым значением, означающим «нет данных» (например, 0 ).

Примечание: Поскольку вы не предоставили никаких образцов данных, я не смог провести никаких тестов, поэтому все вышеперечисленное основано на том, как я понял ваш случай, и, скорее всего, для его получения необходимы некоторые исправления / дополнения.рабочий код.

Дополнение: Как выполнить транскодирование (пример)

Предположим, что означает - источник Series равен:

         ref
lin col     
0   0      1
    1      2
    2      3
1   0      4
    1      5
    2      6
2   0      7
    1      8
    2      9

Выполнить:

Xpix = 5; Ypix = 5       # Target array size (example)
df1 = means.unstack()    # Convert to DataFrame
# Drop top level from the column index ('ref')
df1.columns = df1.columns.droplevel()
df1.columns.name = None  # Drop the name from the column index ('col')
df1.index.name = None    # Drop the name from the row index ('lin')
# Reindex (change the shape), and fill with "empty" values
df1 = df1.reindex(index=range(Xpix), columns=range(Xpix), fill_value=0)

Результат:

   0  1  2  3  4
0  1  2  3  0  0
1  4  5  6  0  0
2  7  8  9  0  0
3  0  0  0  0  0
4  0  0  0  0  0

Теперь у вас есть DataFrame с индексом столбца по умолчанию и индексом строки по умолчанию, но есливы Вы можете взять df1.values - базовый массив Numpy .

0 голосов
/ 22 сентября 2019

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

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