Не удается удалить/удалить столбцы из нескольких файлов с помощью цикла в python

#python #pandas

Вопрос:

Я столкнулся с некоторой проблемой при попытке удалить столбцы из нескольких файлов Excel в Python. Я получаю приведенную ниже ошибку, когда я пытаюсь использовать один и тот же код в одном файле, он работает, но он не работает с несколькими файлами во время цикла, и я не понимаю, в чем причина ошибки [columns ] not found in axis . Я не уверен, в чем проблема с моим кодом. Любая помощь очень ценится.

 import os
import glob
import pandas as pd
from pathlib import Path
folder = (r"C:UserskcDocumentsExtracted")


for file in Path(folder).glob('*.xlsx'):
    df = pd.read_excel(file)
    df2 = df.drop(columns=['BarrierFreeAttributes.BarrierFreeAttribute', 'ConsultationHours.ConsultationHoursTimeSpan', 'Location.Coordinates.Latitude_right', 'Location.Coordinates.Longitude_right'], axis=1)
   
    
df2.to_excel(file.with_suffix('.xlsx'),index = False)
 

ошибка:

 ---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-21-5d2d70719121> in <module>
     12     cols = cols.map(lambda x: x.replace('.','-'))
     13     df.columns = cols
---> 14     df2 = df.drop(columns=['BarrierFreeAttributes.BarrierFreeAttribute', 'ConsultationHours.ConsultationHoursTimeSpan', 'Location.Coordinates.Latitude_right', 'Location.Coordinates.Longitude_right'], axis=1)
     15 
     16 

~Anaconda3libsite-packagespandascoreframe.py in drop(self, labels, axis, index, columns, level, inplace, errors)
   4161                 weight  1.0     0.8
   4162         """
-> 4163         return super().drop(
   4164             labels=labels,
   4165             axis=axis,

~Anaconda3libsite-packagespandascoregeneric.py in drop(self, labels, axis, index, columns, level, inplace, errors)
   3885         for axis, labels in axes.items():
   3886             if labels is not None:
-> 3887                 obj = obj._drop_axis(labels, axis, level=level, errors=errors)
   3888 
   3889         if inplace:

~Anaconda3libsite-packagespandascoregeneric.py in _drop_axis(self, labels, axis, level, errors)
   3919                 new_axis = axis.drop(labels, level=level, errors=errors)
   3920             else:
-> 3921                 new_axis = axis.drop(labels, errors=errors)
   3922             result = self.reindex(**{axis_name: new_axis})
   3923 

~Anaconda3libsite-packagespandascoreindexesbase.py in drop(self, labels, errors)
   5280         if mask.any():
   5281             if errors != "ignore":
-> 5282                 raise KeyError(f"{labels[mask]} not found in axis")
   5283             indexer = indexer[~mask]
   5284         return self.delete(indexer)

KeyError: "['BarrierFreeAttributes.BarrierFreeAttribute'n 'ConsultationHours.ConsultationHoursTimeSpan'n 'Location.Coordinates.Latitude_right'n 'Location.Coordinates.Longitude_right'] not found in axis

 

Комментарии:

1. Распечатайте имя файла в своем цикле, посмотрите, в каком файле отсутствуют столбцы. Если вы выведете файлы Excel в ту же папку, ваш сценарий завершится ошибкой при следующем запуске, так как столбцов там больше нет. Вы можете предотвратить это с errors=ignore помощью df.drop.

2. Привет, я проверил содержимое файлов, просмотрев файлы for file in Path(folder).glob('*.xlsx'): df = pd.read_excel(file) if set(['BarrierFreeAttributes.BarrierFreeAttribute', 'ConsultationHours.ConsultationHoursTimeSpan', 'Location.Coordinates.Latitude_right', 'Location.Coordinates.Longitude_right']).issubset(df.columns): print("exist") else: print("No") , которые я вижу, все файлы содержат столбцы. Но я не знал, где вносить изменения, если я хочу сохранить файлы в другом месте.

Ответ №1:

Весьма вероятно, что в xlsx файле в extracted папке нет столбцов, которые вы хотите удалить. Попробуйте добавить условие фильтра для обработки остальных файлов, а также распечатать имя файла(ов) без столбцов.

 import os
import glob
import pandas as pd
from pathlib import Path
folder = (r"C:UserskcDocumentsExtracted")


for file_name in Path(folder).glob('*.xlsx'):
  df = pd.read_excel(file_name)
  drop_list = ['BarrierFreeAttributes.BarrierFreeAttribute','ConsultationHours.ConsultationHoursTimeSpan', 
'Location.Coordinates.Latitude_right', 'Location.Coordinates.Longitude_right']
    
  if all(item in drop_list for item in list(df.columns)):
       df = df.drop(columns=drop_list, axis=1)
  else:
       print(file_name)
       df.to_excel(file_name.with_suffix('.xlsx'),index = False)
 

Таким образом, вы можете обработать остальные файлы, а также распечатать подозрительные файлы, в которых могут отсутствовать столбцы, которые вы хотите удалить.
Также старайтесь не использовать file в качестве переменной, так как это зарезервированное ключевое слово в python.

Комментарии:

1. Привет, спасибо! Я попробовал этот код, но я получаю эту ошибку, и он не печатает имя файла. Также я проверил все файлы, в каждом файле есть эти столбцы <ipython-input-25-2fd13376> in <module> 11 drop_list = ['BarrierFreeAttributes.BarrierFreeAttribute','ConsultationHours.ConsultationHoursTimeSpan', 12 'Location.Coordinates.Latitude_right', 'Location.Coordinates.Longitude_right'] ---> 13 if all(item in drop_list for item in df.columns.list): 14 df2 = df.drop(columns=drop_list, axis=1) 15 else AttributeError: 'Index' object has no attribute 'list'

2. Я удалил список, df.columns.list теперь он работает, но странно, что он печатает все имена файлов в папке, даже если столбцы существуют. Я не понимаю, почему. Есть идеи, почему?

3. Во фрагменте была ошибка. Я обновил его. Это должны быть list(df.columns) мои извинения

4. Попробуй list(df.columns)

5. Теперь я получаю другую ошибку, и я не понимаю, почему C:UserskcDocumentsExtracted33098_DE.xlsx --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-16-f3c580ce137d> in <module> 14 else: 15 print(file_name) ---> 16 df2.to_excel(file_name.with_suffix('.xlsx'),index = False) NameError: name 'df2' is not defined