У меня есть скрипт, который читает сотни файлов Excel из каталога. Файлы имеют одинаковый формат (все .xls или .xlsx, поэтому могут быть прочитаны пандами), и скрипт преобразует их в кадры данных панд, чтобы выписать их обратно в нужный мне формат. Первые 10 строк каждого файла Excel не нужны, и мне не нужны все пустые строки и столбцы ( Пример электронной таблицы: мне нужны все данные из строки 11 вниз. ), поэтому я удаляю их используйте df.iloc[9:, 0:47]
(47 - максимальный экстент столбцов) и используйте df.dropna(how='all')
, чтобы удалить все строки с пустыми значениями.
for fn in os.listdir(path):
file = os.path.join(path, fn)
if os.path.isfile(file):
##I need the second sheet of each spreadsheet
data = pd.read_excel(file, sheet_name=1, index=False)
relevantData = data.iloc[9:, 0:47] ##This removes the first 10 rows of
##useless data, and caps the
##columns at 48.
relevantData.dropna(how='all')
Тем не менее, до меня дошло, что некоторые файлы Excel имеют одну целую строку. ( Пример изображения. ) Таким образом, заголовки не будут одинаковыми, и данные не будут добавлены в дальнейшей обработке, и сценарий останавливается из-за ошибок интерпретации строки и плавающей запятой (все столбцы заголовка - строки, а остальные данных в основном числовые значения). Я хочу иметь возможность отфильтровать эти файлы или динамически добавить еще одну строку, чтобы убедиться, что они соответствуют остальному большинству файлов.
Есть ли способ включить в цикл for проверку позиции df.iloc[0,0]
(даже после того, как я уже использовал df.iloc
в коде ранее), чтобы содержать подстроку, которая указала бы, что файл отсутствует строка? Если значение ячейки данных имеет подстроку 'act', тогда я знаю, что формат правильный, и он может продолжаться для дальнейшей обработки. Если подстрока не существует (иначе говоря, файл имеет длину 1 строки или нестандартный формат), либо добавьте строку в 9-й индекс позиции (если это возможно), либо, по крайней мере, выплюните эти файлы для предварительной обработки вручную.
Я пытался использовать if df.iloc[row position, column position].str.contains('act'):
, но, похоже, размещение этого кода в скрипте отображает значение кадра данных как не последовательность? Выдает исключение: AttributeError: 'str' object has no attribute 'str'
.
Затем я попробовал другой подход: if sub in df.iloc[0,0]:
(где sub - это переменная = 'act'.
Но даже когда «act» существовал в этой позиции, скрипт отправлял значения в False-часть цикла for, однако мне нужно, чтобы он отправлял его в True-маршрут.
(Также пробовал if sub in df[0,0]:
, это выдает ошибку: KeyError: (0, 0)
)
import os
import pandas as pd
dfList = []
path = 'H:\DirectoryWithExcelFiles'
newpath = 'H:\FolderWithNewFiles_ThatContain_act'
newpath2 = 'H:\FolderWithNonStandardFiles_DontContain_act'
for fn in os.listdir(path):
file = os.path.join(path, fn)
if os.path.isfile(file):
##I need the second sheet of each spreadsheet
data = pd.read_excel(file, sheet_name=1, index=False)
relevantData = data.iloc[9:, 0:47] ##This removes the first 10 rows of
##useless data, and caps the
##columns at 48.
relevantData.dropna(how='all')
sub = 'act'
if sub in relevantData[0,0]:
# Create a Pandas Excel writer using XlsxWriter as the engine.
writer1 = pd.ExcelWriter('H:\FolderWithNewFiles_ThatContain_act\\' + fn, engine='xlsxwriter')
# Convert the dataframe to an XlsxWriter Excel object.
relevantData.to_excel(writer1, sheet_name='Sheet1', index=False, header=None)
# Close the Pandas Excel writer and output the Excel file.
writer1.save()
else:
## Ideally I would want to add the new row to the data frame here at
##9th position and then send back to the beginning of the loop.
writer2 = pd.ExcelWriter('H:\FolderWithNonStandardFiles_DontContain_act\\' + fn, engine='xlsxwriter')
# Convert the dataframe to an XlsxWriter Excel object.
relevantData.to_excel(writer2, sheet_name='Sheet1', index=False, header=None)
# Close the Pandas Excel writer and output the Excel file.
writer2.save()
Я ожидаю, что если подстрока 'act'
находится в значении данных в df[0,0]
, то файлы должны быть выведены в newpath1
, однако я могу только передать файлы в операторе else:
(newpath2
), даже если при печати значения перед передачей его через 2-й цикл if print (relevantData.iloc[0,0])
значение явно содержит подстроку 'act' в строке 'Action Item / Dig #' ( Пример изображения позиции, явно имеющей подстроку. )
У кого-нибудь есть какие-либо решения относительно того, почему цикл for не распознает позиционирование iloc [] и не проверит, если строка существует? Я могу предоставить образцы электронных таблиц, если их спросят.