#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