Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Como converter uma lista de tables em um dataframe?

Tenho o seguinte código que faz a leitura de um PDF com várias páginas

import tabula
df = tabula.read_pdf("dados/nota.pdf", guess=False, stream=True, multiple_tables=True, pages='all', encoding="utf-8", area=(238.00, 32.00, 400.00, 563.00))

Em cada uma dessas páginas do PDF, em um mesmo local, existe uma tabela. O que é retornado em 'df' é uma lista com o conteúdo das tables nesse formato:

[     0           1    2             3      4                        5   \
 0     Q  Negociação  C/V  Tipo mercado  Prazo  Especificação do título   
 1   NaN   1-BOVESPA    C         VISTA    NaN              ITAUSAPN N1   
 2   NaN   1-BOVESPA    C         VISTA    NaN       LOCAMERICAON EB NM   
 3   NaN   1-BOVESPA    C         VISTA    NaN       LOCAMERICAON EB NM   
 4   NaN   1-BOVESPA    C         VISTA    NaN            PETRORIOON NM   
 5   NaN   1-BOVESPA    C         VISTA    NaN            PETRORIOON NM   
 6   NaN   1-BOVESPA    C         VISTA    NaN                 SCHULZPN   
 7   NaN   1-BOVESPA    C         VISTA    NaN                 SCHULZPN   
 8   NaN   1-BOVESPA    C         VISTA    NaN           VULCABRASON NM   
 9   NaN   1-BOVESPA    C         VISTA    NaN           VULCABRASON NM   
 10  NaN   1-BOVESPA    C         VISTA    NaN           VULCABRASON NM   
 11  NaN   1-BOVESPA    C         VISTA    NaN           VULCABRASON NM   

           6           7    8               9                        10   11  
 0   Obs. (*)  Quantidade  NaN  Preço / Ajuste  Valor Operação / Ajuste  D/C  
 1        NaN         NaN  800           13,84                11.072,00    D  
 2        NaN         NaN  300           17,01                 5.103,00    D  
 3        NaN         NaN  200           17,01                 3.402,00    D  
 4        NaN         NaN  500           18,01                 9.005,00    D  
 5        NaN         NaN  100           18,01                 1.801,00    D  
 6        NaN         NaN  500            8,79                 4.395,00    D  
 7        NaN         NaN  700            8,78                 6.146,00    D  
 8        NaN         NaN  300            7,87                 2.361,00    D  
 9        NaN         NaN  300            7,87                 2.361,00    D  
 10       NaN         NaN  300            7,87                 2.361,00    D  
 11       NaN         NaN  200            7,87                 1.574,00    D  ,
      0           1    2             3      4                        5   \
 0     Q  Negociação  C/V  Tipo mercado  Prazo  Especificação do título   
 1   NaN   1-BOVESPA    V         VISTA    NaN          LOCAMERICAON NM   
 2   NaN   1-BOVESPA    V         VISTA    NaN          LOCAMERICAON NM   
 3   NaN   1-BOVESPA    V         VISTA    NaN          LOCAMERICAON NM   
 4   NaN   1-BOVESPA    V         VISTA    NaN          LOCAMERICAON NM   
 5   NaN   1-BOVESPA    V         VISTA    NaN          LOCAMERICAON NM   
 6   NaN   1-BOVESPA    V         VISTA    NaN            PETRORIOON NM   
 7   NaN   1-BOVESPA    C         VISTA    NaN           VULCABRASON NM   
 8   NaN   1-BOVESPA    V         VISTA    NaN           VULCABRASON NM   
 9   NaN   1-BOVESPA    V         VISTA    NaN           VULCABRASON NM   
 10  NaN   1-BOVESPA    V         VISTA    NaN           VULCABRASON NM   

           6           7   8               9                        10  11   12  
 0   Obs. (*)  Quantidade NaN  Preço / Ajuste  Valor Operação / Ajuste NaN  D/C  
 1        NaN         100 NaN           17,20                 1.720,00 NaN    C  
 2        NaN         100 NaN           17,20                 1.720,00 NaN    C  
 3        NaN         100 NaN           17,20                 1.720,00 NaN    C  
 4        NaN         100 NaN           17,20                 1.720,00 NaN    C  
 5        NaN         100 NaN           17,20                 1.720,00 NaN    C  
 6        NaN         600 NaN           18,60                11.160,00 NaN    C  
 7          D       1.100 NaN            7,75                 8.525,00 NaN    D  
 8          D         100 NaN            7,86                   786,00 NaN    C  
 9          D         100 NaN            7,86                   786,00 NaN    C  
 10         D         900 NaN            7,86                 7.074,00 NaN    C  ]

Como converter isso em um dataframe?

4 respostas

Olá Andre,

Compartilha o pdf por favor pra gente poder fazer alguns testes. Se possível manda aqui por um link do Google Drive ou algo do tipo.

Link: https://drive.google.com/open?id=1ra_znUECNGm_iHtV6oZYreaaSzWDkdlG

Por conta de algumas informações sensíveis, fiz algumas alterações no PDF antes de disponibilizar, mas acho que dá pra ter uma ideia

solução!

O resultado que você conseguiu já está em formato de DataFrame, é uma lista de DataFrames para ser mais exato, você pode ver o DataFrame da primeira página executando df[0] ou juntar todos os DataFrames da lista em um só com pd.concat(df)

Testando o pdf parece que essa ferramenta (tabula) tem dificuldades pra ler algumas partes do conteúdo, mas pode ser algo causado pelo modo que o pdf foi gerado ou editado.

Essa biblioteca utiliza o tabula-java por trás, e até testando diretamente na ferramenta original não consegui obter todas as tabelas igualmente (as colunas aparecem incorretas):

Recomendo você também tentar utilizar a ferramente base para testar, você pode baixar nesse link.

Muito obrigado, Lucas. Usando pd.concat(df) funcionou!