Удаление строк из DataFrame pandas вызывает ошибку ключа в Dataloader.

Вопрос или проблема

Я пытаюсь загрузить некоторые данные в загрузчик данных. При попытке предварительной обработки DataFrame с помощью, например, df.dropna(), в процессе работы с DataFrame иногда возникают “keyerrors”. Это не происходит, когда я не удаляю ни одной строки.

Создание набора данных:

# загрузить данные и добавить столбцы
column_names = ["id","category","labelStr","text"]
trainingData = pd.read_csv(r"Path.csv",names=column_names)
validationData = pd.read_csv(r"Path.csv",names=column_names)

trainingData = trainingData.drop(columns=['id', 'category'])
validationData = validationData.drop(columns=['id', 'category'])

trainingData = trainingData.dropna()  ############### Добавление этого вызывает keyerror

trainingData['text'] = trainingData['text'].apply(clean_tweet)

# преобразовать строку в целое число
label_encoder = LabelEncoder()
trainingData['label'] = label_encoder.fit_transform(trainingData[["labelStr"]])
validationData['label'] = label_encoder.transform(validationData[["labelStr"]])

# инициализировать токенизатор
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
MAX_LEN = 128  # Длина должна быть достаточной, так как твиты ограничены по длине

# создать наборы данных
train_dataset = TweetsDataset(trainingData, tokenizer, MAX_LEN)
val_dataset = TweetsDataset(validationData, tokenizer, MAX_LEN)

Загрузчик данных

BATCH_SIZE = 16

train_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=BATCH_SIZE, shuffle=False)

for batch in train_loader:
   print(batch)
   break

Ошибка

KeyError                                  Traceback (most recent call last)
...\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
   3079             try:
-> 3080                 return self._engine.get_loc(casted_key)
   3081             except KeyError as err:

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.Int64HashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

KeyError: 63935

Вышеупомянутое исключение было непосредственной причиной следующего исключения:

KeyError                                  Traceback (most recent call last)
<ipython-input-187-9bd6dc44b4d8> in <module>
      5 val_loader = DataLoader(val_dataset, batch_size=BATCH_SIZE, shuffle=False)
      6 
----> 7 for batch in train_loader:
      8     print(batch)
...
-> 3082                 raise KeyError(key) from err
   3083 
   3084         if tolerance is not None:

KeyError: 63935

Ответ или решение

Устранение ошибки KeyError при удалении строк из DataFrame в Pandas

При работе с библиотекой Pandas и загрузке данных с использованием DataLoader, ошибка KeyError может возникнуть из-за нескольких причин, особенно при удалении строк из DataFrame с помощью метода dropna(). Давайте рассмотрим, как можно избежать этой проблемы и решить её.

Причины возникновения KeyError

Ошибка KeyError может возникнуть в следующих случаях:

  1. Индексы после удаления: Когда вы используете df.dropna(), Pandas создает новый DataFrame с удаленными строками, но индексы в новом DataFrame могут не совпадать с исходными индексами. Это может вызвать ошибки при попытке доступиться к удалённым элементам по старым индексам.
  2. Отсутствующие метки: Если ваша модель или DataLoader пытаются получить доступ к строкам DataFrame, используя индексы, которые были удалены, вы столкнётесь с ошибкой KeyError.

Решения и рекомендации

1. Сброс индексов после фильтрации

Одним из самых простых способов избежать проблем с индексами является сброс индексов DataFrame после удаления строк. Это можно сделать с помощью метода reset_index():

trainingData = trainingData.dropna().reset_index(drop=True)

Использование параметра drop=True предотвратит создание нового столбца с прошлыми индексами.

2. Проверка наличия необходимых столбцов

Прежде чем использовать apply() для очистки текста, убедитесь, что столбец существует:

if 'text' in trainingData.columns:
    trainingData['text'] = trainingData['text'].apply(clean_tweet)
else:
    print("Столбец 'text' отсутствует в DataFrame")

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

3. Проверка данных перед использованием в DataLoader

Перед инициализацией DataLoader убедитесь, что DataFrame готов и не содержит ошибок:

if not trainingData.empty:
    train_dataset = TweetsDataset(trainingData, tokenizer, MAX_LEN)
else:
    print("Уведомление: DataFrame trainingData пуст.")

4. Использование подходящих типов данных

При кодировании меток с помощью LabelEncoder убедитесь, что в ваших данных нет NaN значений. В противном случае LabelEncoder может выдавать ошибку или некорректные значения.

trainingData['label'] = label_encoder.fit_transform(trainingData['labelStr'].dropna())

Это поможет сохранить корректность потока данных.

Заключение

Ошибки, связанные с KeyError при работе с Pandas и DataLoader, могут быть вызваны проблемами с индексами и отсутствием столбцов. Применение простых решений, таких как сброс индексов и проверка наличия данных, позволит избежать подобных ошибок и улучшит устойчивость вашего кода. Убедитесь, что вы правильно обрабатываете данные на каждом этапе архитектуры вашего приложения.

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

Оцените материал
Добавить комментарий

Капча загружается...