Como ler um dataframe bem impresso em um dataframe Pandas?

Aug 23 2020
# necessary imports
from tabulate import tabulate
import pandas as pd

Eu tenho um dataframe :

df = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                   'B': ['B0', 'B1', 'B2', 'B3'],
                   'C': ['C0', 'C1', 'C2', 'C3'],
                   'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 1, 2, 3])

Usando isso , eu imprimo:

prettyprint=tabulate(df, headers='keys', tablefmt='psql')
print(prettyprint)

Resultado:

+----+-----+-----+-----+-----+
|    | A   | B   | C   | D   |
|----+-----+-----+-----+-----|
|  0 | A0  | B0  | C0  | D0  |
|  1 | A1  | B1  | C1  | D1  |
|  2 | A2  | B2  | C2  | D2  |
|  3 | A3  | B3  | C3  | D3  |
+----+-----+-----+-----+-----+

Salvando em um arquivo de texto:

with open("PrettyPrintOutput.txt","w") as text_file:
    text_file.wite(prettyprint)

Como posso ler PrettyPrintOutput.txtem um dataframe sem fazer muito processamento de texto manualmente?

Respostas

2 above_c_level Aug 23 2020 at 15:25

Uma solução é usar argumentos de palavras-chave inteligentes em pd.read_csv/ pd.read_clipboard:

    df = pd.read_csv(r'PrettyPrintOutput.txt', sep='|', comment='+', skiprows=[2], index_col=1)
    df = df[[col for col in df.columns if 'Unnamed' not in col]]

Eu apenas defino todas as linhas que começam com '+' como comentários, para que não sejam importadas. Isso não ajuda na terceira linha, que deve ser excluída com o skiprow.

A segunda linha é necessária porque você acaba com colunas adicionais usando o caractere '|' como separador. Se você souber os nomes das colunas com antecedência, use a palavra usecols- chave para ser explícito.

Resultado:

       A      B      C      D   
                                
0      A0     B0     C0     D0  
1      A1     B1     C1     D1  
2      A2     B2     C2     D2  
3      A3     B3     C3     D3 

Também funciona com pd.read_clipboard, porque as funções aceitam os mesmos argumentos de palavra-chave.