J'ai un fichier txt avec des données dans ce format. Les 3 premières lignes se répètent encore et encore.
name=1
grade=A
class=B
name=2
grade=D
class=A
Je voudrais sortir les données sous forme de tableau, par exemple:
name | grade | class
1 | A | B
2 | D | A
J'ai du mal à définir les en-têtes et à parcourir les données. Ce que j'ai essayé jusqu'à présent, c'est:
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)
La sortie de cela est
+-------+-----+
| 0 | 1 |
|-------+-----|
| name | 1 |
| grade | A |
| class | B |
| name | 2 |
| grade | D |
| class | A |
+-------+-----+
Pas vraiment ce que je recherche.
df = pd.read_table(file, header=None)
, faites la ligne suivantenew = df[0].str.split("=", n=1, expand=True)
, et ce serait ma réponse préférée en termes de "code sympa".%timeit
lancer une contre ma réponse et j'ai été surpris de la lenteur de la solution des pandas purs. C'était environ x7 plus lent sur ma machine (pour un très petit fichier txt d'entrée)! Avec la commodité vient les frais généraux, avec les frais généraux (la plupart du temps) vient la perte de performances ...Je sais que vous avez suffisamment de réponses, mais voici une autre façon de le faire en utilisant le dictionnaire:
Cela vous donne la sortie comme:
Juste pour avoir une autre perspective.
la source
Comme vous avez une sortie, voici comment je traiterais le problème:
Créez d'abord un index unique basé sur la répétabilité des colonnes,
nous utilisons ensuite cela pour faire pivoter votre dataframe en utilisant la
crosstab
fonctionla source
Ce que vous pourriez également faire, c'est lire votre fichier texte
file
par blocs de 3, créer une liste imbriquée et le mettre dans une trame de données:df
serait directementNote # 1: Bien que cela fasse plus de lignes de code qu'une
pandas
solution pure , selon mon expérience, elle est probablement plus efficace car elle utilise moins depandas
fonctions et donc moins de surcharge.Note # 2: En général, je dirais qu'il serait préférable de stocker vos données d'entrée dans un autre format, par exemple
json
oucsv
. cela le rendrait beaucoup plus facile à lire, par exemple avec lapandas
fonction read_csv dans le cas d'un fichier csv.la source
Vous pouvez générer cette sortie en utilisant le module Dictionnaire de Python et Pandas.
Cette approche n'est peut-être pas la plus efficace, mais elle n'utilise aucune des fonctions avancées de Pandas. J'espère que cela aide.
Le résultat:
la source
À mon humble avis, toutes les réponses actuelles semblent trop compliquées. Ce que je ferais, c'est d'utiliser
'='
commesep
paramètre depd.read_csv
lire 2 colonnes, puispivot
le DataFrame obtenu:Si vous ne voulez pas cet index de colonne à plusieurs niveaux dans le résultat, vous pouvez le supprimer en:
la source