Как перебрать список фреймов данных и удалить все данные, если конкретная строка не найдена - PullRequest
2 голосов
/ 08 марта 2019

Я использую библиотеку Python Camelot для анализа нескольких PDF-файлов и извлечения всех таблиц в этих PDF-файлах.Первая строка кода возвращает все таблицы, которые были извлечены из PDF-файла в виде списка.В частности, я ищу одну таблицу с уникальной строкой.К счастью, эта строка уникальна для этой таблицы, поэтому я теоретически могу использовать ее для выделения таблицы, которую я хочу захватить.

Эти PDF-файлы более или менее созданы в одном и том же формате, однако достаточно дисперсиичто я не могу просто сделать статический вызов на столе, который я хочу.Например, иногда таблица, которую я хочу, будет первой очищенной таблицей, а иногда - третьей.Поэтому мне нужно написать некоторый код, чтобы иметь возможность динамически выбирать таблицу.

Рабочий процесс, который я имею в виду, логически выглядит следующим образом:

Создайте пустой список перед циклом for длядобавить таблицы к.Вызвать цикл for и выполнить итерацию по каждой таблице в списке, выводимом кодом Camelot.Если в таблице нет искомой строки, удалите все данные в этой таблице, а затем добавьте пустой фрейм данных в пустой список.Если в нем есть искомая строка, добавьте ее в пустой список, не удаляя ничего.

Есть ли лучший способ сделать это?Я уверен, что, вероятно, есть.

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

import camelot
import pandas as pd

#this creates a list of all the tables that Camelot scrapes from the pdf
tables = camelot.read_pdf('pdffile', flavor ='stream', pages = '1-end')

#empty list to append the tables to
elist = []

for t in tables:
    dftemp = t.df

    #my attempt at dropping all the value if the unique value isnt found. THIS DOESNT WORK
    dftemp[dftemp.values  != "Unique Value", dftemp.iloc[0:0]]

    #append to the list
    elist.append(dftemp)

#combine all the dataframes in the list into one dataframe
dfcombined = pd.concat(elist)

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Вы можете сделать это в один ряд:

dfcombined = pd.concat([t.df if "Unique Value" in t.df.values else pd.DataFrame() for t in tables ])
1 голос
/ 08 марта 2019

Вы можете использовать оператор 'in' для массива numpy, возвращаемого dftemp.values ссылка

for t in tables:
    dftemp = t.df

    #my attempt
    if "Unique Value" in dftemp.values:
        #append to the list
        elist.append(dftemp)
...