Python KeyError: для значения x_col в flow_from_dataframe для ссылки на существующий столбец - PullRequest
1 голос
/ 27 февраля 2020

Мой код ниже выглядит следующим образом:

   train_generator = aug.flow_from_dataframe(dataframe = z1,
                                              directory = None,
                                              x_col = 'id',
                                              y_col = 'label',
                                              class_mode = 'categorical',
                                              target_size = (mysize, mysize),
                                              shuffle = True,
                                              batch_size = mybatch,
                                              seed = 40)
    val_datagen = ImageDataGenerator(rescale = 1./255)
    val_generator = val_datagen.flow_from_dataframe(z2,
                                                   x_col = 'id',
                                                   y_col = 'label',
                                                   class_mode = 'categorical',
                                                   target_size = (mysize, mysize),
                                                   batch_size = mybatch,
                                                   seed = 41)
    test_datagen = ImageDataGenerator(rescale = 1./255)
    test_generator = test_datagen.flow_from_dataframe(testfiles,
                                                     x_col = 'id',
                                                     directory = None,
                                                     color_mode = 'rgb',
                                                     target_size = (mysize, mysize),
                                                     batch_size = 1,
                                                     class_mode = None,
                                                     shuffle = False,
                                                     seed = 42)

Я проверил, и все мои фреймы данных z1, z2 и testfiles имеют столбец внутри, который помечен id. Вот head() для каждого из них:

z1.head()

Output:
label   id
0   0.0 train/cat.5077.jpg
1   0.0 train/cat.2718.jpg
2   0.0 train/cat.10151.jpg
3   0.0 train/cat.3406.jpg
4   0.0 train/cat.4369.jpg

z2.head()

Output:
label   id
6   0.0 train/cat.8553.jpg
7   0.0 train/cat.9895.jpg
9   0.0 train/cat.6218.jpg
11  0.0 train/cat.12020.jpg
17  0.0 train/cat.10637.jpg

testfiles.head()

Output:
    id

testfiles - пустой DataFrame, но он содержит столбец с именем id.

Так что это очень запутанно, что я Я получаю KeyError, который отображается следующим образом:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
//anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   2656             try:
-> 2657                 return self._engine.get_loc(key)
   2658             except KeyError:

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

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

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'id'

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-15-2a56a9e3c4bf> in <module>
     40                                                      class_mode = None,
     41                                                      shuffle = False,
---> 42                                                      seed = 42)

//anaconda3/lib/python3.7/site-packages/keras/preprocessing/image.py in flow_from_dataframe(self, dataframe, directory, x_col, y_col, weight_col, target_size, color_mode, classes, class_mode, batch_size, shuffle, seed, save_to_dir, save_prefix, save_format, subset, interpolation, validate_filenames, **kwargs)
    592             interpolation=interpolation,
    593             validate_filenames=validate_filenames,
--> 594             **kwargs
    595         )
    596 

//anaconda3/lib/python3.7/site-packages/keras/preprocessing/image.py in __init__(self, dataframe, directory, image_data_generator, x_col, y_col, weight_col, target_size, color_mode, classes, class_mode, batch_size, shuffle, seed, data_format, save_to_dir, save_prefix, save_format, subset, interpolation, dtype, validate_filenames)
    233             interpolation=interpolation,
    234             dtype=dtype,
--> 235             validate_filenames=validate_filenames)
    236 
    237 

//anaconda3/lib/python3.7/site-packages/keras_preprocessing/image/dataframe_iterator.py in __init__(self, dataframe, directory, image_data_generator, x_col, y_col, weight_col, target_size, color_mode, classes, class_mode, batch_size, shuffle, seed, data_format, save_to_dir, save_prefix, save_format, subset, interpolation, dtype, validate_filenames)
    144         if class_mode not in ["input", "multi_output", "raw", None]:
    145             self.classes = self.get_classes(df, y_col)
--> 146         self.filenames = df[x_col].tolist()
    147         self._sample_weight = df[weight_col].values if weight_col else None
    148 

//anaconda3/lib/python3.7/site-packages/pandas/core/frame.py in __getitem__(self, key)
   2925             if self.columns.nlevels > 1:
   2926                 return self._getitem_multilevel(key)
-> 2927             indexer = self.columns.get_loc(key)
   2928             if is_integer(indexer):
   2929                 indexer = [indexer]

//anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   2657                 return self._engine.get_loc(key)
   2658             except KeyError:
-> 2659                 return self._engine.get_loc(self._maybe_cast_indexer(key))
   2660         indexer = self.get_indexer([key], method=method, tolerance=tolerance)
   2661         if indexer.ndim > 1 or indexer.size > 1:

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

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

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'id'

Кто-нибудь знает, что здесь происходит? Из того, что я понимаю, KeyError возникает при ссылке на значение, которое не содержится в словаре, то есть на столбец, который не существует.

Из того, что я понимаю, аналогичная проблема упоминается в другой сообщение , но, похоже, не решено:

1 Ответ

0 голосов
/ 26 марта 2020

Генератор данных изображения первый проверяет файлы в вашем DataFrame , существуют ли они все , таким образом повышая Key error, если есть проверять нечего.

Если вы проверяете свой журнал трассировки ошибок.

# get labels for each observation
        if class_mode not in ["input", "multi_output", "raw", None]:
            self.classes = self.get_classes(df, y_col)
        self.filenames = df[x_col].tolist()    <<< ERROR HERE
        self._sample_weight = df[weight_col].values if weight_col else None

Этот преобразует все значения, содержащиеся в DataFrame df, в list .

Таким образом, если вы копаете немного дальше.

if self.columns.nlevels > 1:
                return self._getitem_multilevel(key)
            indexer = self.columns.get_loc(key)   <<< ERROR HERE
            if is_integer(indexer):
                indexer = [indexer]

Вы можете видеть, что строка, в которой key в column является индексом, использованным для ссылок.
Передача пустого массива [] гарантированно вызовет ошибку, так как вы будете использовать Nothing в качестве ссылки.

А также, генератор данных изображения просто возвращает значение , означающее, что оно будет бесполезным при подаче пустого массива.
Для этого вы можете попытаться создать DataFrame с пустой строкой testfiles = pd.DataFrame([''], columns = ['id']), чтобы не встретить Key Error.

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