Eu tenho um arquivo txt com dados neste formato. As três primeiras linhas se repetem repetidamente.
name=1
grade=A
class=B
name=2
grade=D
class=A
Gostaria de exibir os dados em um formato de tabela, por exemplo:
name | grade | class
1 | A | B
2 | D | A
Estou lutando para definir os cabeçalhos e apenas fazer um loop sobre os dados. O que eu tentei até agora é:
def myfile(filename):
with open(file1) as f:
for line in f:
yield line.strip().split('=',1)
def pprint_df(dframe):
print(tabulate(dframe, headers="keys", tablefmt="psql", showindex=False,))
#f = pd.DataFrame(myfile('file1')
df = pd.DataFrame(myfile('file1'))
pprint_df(df)
A saída disso é
+-------+-----+
| 0 | 1 |
|-------+-----|
| name | 1 |
| grade | A |
| class | B |
| name | 2 |
| grade | D |
| class | A |
+-------+-----+
Não é exatamente o que estou procurando.
df = pd.read_table(file, header=None)
, faça a seguinte linhanew = df[0].str.split("=", n=1, expand=True)
, e essa seria minha resposta favorita em termos de "código legal".%timeit
concordei com a minha resposta e fiquei surpreso com a lentidão da solução dos pandas puros. Era cerca de x7 mais lento na minha máquina (para um arquivo txt de entrada muito pequeno)! Com conveniência vem em cima, com sobrecarga (na maioria das vezes) vem perda no desempenho ...Eu sei que você tem respostas suficientes, mas aqui está outra maneira de fazê-lo usando o dicionário:
Isso fornece a saída como:
Só para ter outra perspectiva.
fonte
Como você tem uma saída, é assim que eu lidaria com o problema:
Primeiro, crie um índice exclusivo com base na repetibilidade das colunas,
então usamos isso para dinamizar seu quadro de dados usando a
crosstab
funçãofonte
O que você também pode fazer é ler seu arquivo de texto
file
em blocos de 3, criar uma lista aninhada e colocá-la em um dataframe:df
seria diretamenteNota # 1: Embora isso crie mais linhas de código do que uma
pandas
solução pura , na minha experiência, é provável que seja mais eficiente, pois utiliza menospandas
funções e menos sobrecarga.Nota 2: Em geral, eu argumentaria que seria melhor armazenar seus dados de entrada em outro formato, por exemplo,
json
oucsv
. isso tornaria muito mais fácil a leitura, por exemplo, com apandas
função read_csv no caso de um arquivo csv.fonte
Você pode gerar essa saída usando o módulo Dicionário do Python e o Pandas.
Essa abordagem pode não ser a mais eficiente, mas não usa nenhuma das funções avançadas do Pandas. Espero que ajude.
A saída:
fonte
IMHO, todas as respostas atuais parecem muito complicadas. O que eu faria é usar
'='
comosep
parâmetropd.read_csv
para ler 2 colunas e, em seguida,pivot
o DataFrame obtido:Se você não quiser esse índice de coluna multinível no resultado, poderá removê-lo:
fonte