Как проверить, существует ли значение в определенной позиции в кадре данных pandas (индекс и столбец), используя подстроку и цикл for - PullRequest
0 голосов
/ 26 марта 2019

У меня есть скрипт, который читает сотни файлов 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 [] и не проверит, если строка существует? Я могу предоставить образцы электронных таблиц, если их спросят.

...