Ich habe eine TXT-Datei mit Daten in diesem Format. Die ersten 3 Zeilen wiederholen sich immer wieder.
name=1
grade=A
class=B
name=2
grade=D
class=A
Ich möchte die Daten in einem Tabellenformat ausgeben, zum Beispiel:
name | grade | class
1 | A | B
2 | D | A
Ich habe Mühe, die Header zu setzen und nur die Daten zu durchlaufen. Was ich bisher versucht habe ist:
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)
Die Ausgabe davon ist
+-------+-----+
| 0 | 1 |
|-------+-----|
| name | 1 |
| grade | A |
| class | B |
| name | 2 |
| grade | D |
| class | A |
+-------+-----+
Nicht wirklich das, wonach ich suche.
df = pd.read_table(file, header=None)
, machen Sie die folgende Zeilenew = df[0].str.split("=", n=1, expand=True)
, und dies wäre meine Lieblingsantwort in Bezug auf "netten Code".%timeit
gegen meine Antwort und war überrascht, wie langsam die reine Pandas-Lösung ist. Auf meinem Computer war es ungefähr x7 langsamer (für eine sehr kleine txt-Eingabedatei)! Mit der Bequemlichkeit kommt Overhead, mit Overhead (meistens) kommt Leistungsverlust ...Ich weiß, dass Sie genug Antworten haben, aber hier ist eine andere Möglichkeit, dies mit dem Wörterbuch zu tun:
Dies gibt Ihnen die Ausgabe als:
Nur um eine andere Perspektive zu bekommen.
quelle
Da Sie eine Ausgabe haben, würde ich mit dem Problem folgendermaßen umgehen:
Erstellen Sie zunächst einen eindeutigen Index basierend auf der Wiederholbarkeit der Spalten.
Wir verwenden dies dann, um Ihren Datenrahmen mithilfe der
crosstab
Funktion zu schwenkenquelle
Sie können Ihre Textdatei auch
file
in Dreierblöcken lesen , eine verschachtelte Liste erstellen und diese in einen Datenrahmen einfügen:df
wäre direktHinweis Nr. 1: Obwohl dies mehr Codezeilen als eine reine
pandas
Lösung ergibt, ist es meiner Erfahrung nach wahrscheinlich effizienter, da wenigerpandas
Funktionen und damit weniger Overhead verwendet werden.Anmerkung 2: Im Allgemeinen würde ich argumentieren, dass es besser wäre, Ihre Eingabedaten in einem anderen Format zu speichern, z . B.
json
odercsv
. das würde das Lesen viel einfacher machen, zum Beispiel mit derpandas
Funktion read_csv im Fall einer CSV-Datei.quelle
Sie können diese Ausgabe mithilfe des Python-Wörterbuchmoduls und von Pandas generieren .
Dieser Ansatz ist möglicherweise nicht der effizienteste, verwendet jedoch keine der erweiterten Funktionen von Pandas. Ich hoffe es hilft.
Die Ausgabe:
quelle
IMHO sehen alle aktuellen Antworten zu kompliziert aus. Was ich tun würde, ist,
'='
alssep
Parameterpd.read_csv
zum Lesen von 2 Spalten und dannpivot
den erhaltenen DataFrame zu verwenden:Wenn Sie diesen mehrstufigen Spaltenindex nicht im Ergebnis haben möchten, können Sie ihn entfernen durch:
quelle