Lesen von Schlüsselwertpaaren in Pandas

Pandas macht es wirklich einfach, eine CSV-Datei zu lesen:

pd.read_table('data.txt', sep=',') 

Hat Pandas etwas Ähnliches für eine Datei mit Schlüsselwertpaaren? Ich bin damit fertig:

 pd.DataFrame([dict([p.split('=') for p in l.split(',')]) for l in open('data.txt')]) 

Wenn nicht eingebaut, dann vielleicht etwas idiomatischer?

Die interessante Akte sieht so aus:

 symbol=ESM3,exchange=GLOBEX,timestamp=1365428525690751,price=1548.00,quantity=551 symbol=ESM3,exchange=GLOBEX,timestamp=1365428525697183,price=1548.00,quantity=551 symbol=ESM3,exchange=GLOBEX,timestamp=1365428525714498,price=1548.00,quantity=551 symbol=ESM3,exchange=GLOBEX,timestamp=1365428525734967,price=1548.00,quantity=551 symbol=ESM3,exchange=GLOBEX,timestamp=1365428525735567,price=1548.00,quantity=555 symbol=ESM3,exchange=GLOBEX,timestamp=1365428525735585,price=1548.00,quantity=556 symbol=ESM3,exchange=GLOBEX,timestamp=1365428525736116,price=1548.00,quantity=556 symbol=ESM3,exchange=GLOBEX,timestamp=1365428525740757,price=1548.00,quantity=556 symbol=ESM3,exchange=GLOBEX,timestamp=1365428525748502,price=1548.00,quantity=556 symbol=ESM3,exchange=GLOBEX,timestamp=1365428525748952,price=1548.00,quantity=557 

Es hat genau die gleichen Schlüssel auf jeder Zeile und in der gleichen Reihenfolge. Es gibt keine Nullwerte. Die zu generierende Tabelle lautet:

  exchange price quantity symbol timestamp 0 GLOBEX 1548.00 551\n ESM3 1365428525690751 1 GLOBEX 1548.00 551\n ESM3 1365428525697183 2 GLOBEX 1548.00 551\n ESM3 1365428525714498 3 GLOBEX 1548.00 551\n ESM3 1365428525734967 4 GLOBEX 1548.00 555\n ESM3 1365428525735567 5 GLOBEX 1548.00 556\n ESM3 1365428525735585 6 GLOBEX 1548.00 556\n ESM3 1365428525736116 7 GLOBEX 1548.00 556\n ESM3 1365428525740757 8 GLOBEX 1548.00 556\n ESM3 1365428525748502 9 GLOBEX 1548.00 557\n ESM3 1365428525748952 

(Ich kann das \n aus der quantity mit einem rstrip() entfernen, nachdem ich es hereingebracht habe.)

  • Effiziente Möglichkeit, Elemente in einer Pandas-Gruppe bedingungslos zu füllen (evtl. durch Anwenden einer Funktion)
  • Pandas: Absturz beim Aufteilen einer Spalte durch den anderen mit Indexsatz
  • Interpolation auf DataFrame in Pandas
  • Viertel von Monaten berechnen
  • In-group Zeit-zu-Ereignis-Zähler
  • Wie man in Pandas entstapelt (oder schwenkt)?
  • Matrizen sind nicht ausgerichtete Fehlermeldung
  • Wie erstelle ich Werte mit Keine im Pandas-Datenrahmen in Python?
  • 2 Solutions collect form web for “Lesen von Schlüsselwertpaaren in Pandas”

    Wenn Sie die Schlüsselnamen vorher kennen und wenn die Namen immer in der gleichen Reihenfolge erscheinen, dann könnten Sie einen Konverter verwenden, um die Schlüsselnamen abzuschneiden, und verwenden Sie dann den names , um die Spalten zu benennen:

     import pandas as pd def value(item): return item[item.find('=')+1:] df = pd.read_table('data.txt', header=None, delimiter=',', converters={i:value for i in range(5)}, names='symbol exchange timestamp price quantity'.split()) print(df) 

    Auf Ihre gebuchten Datenerträge

      symbol exchange timestamp price quantity 0 ESM3 GLOBEX 1365428525690751 1548.00 551 1 ESM3 GLOBEX 1365428525697183 1548.00 551 2 ESM3 GLOBEX 1365428525714498 1548.00 551 3 ESM3 GLOBEX 1365428525734967 1548.00 551 4 ESM3 GLOBEX 1365428525735567 1548.00 555 5 ESM3 GLOBEX 1365428525735585 1548.00 556 6 ESM3 GLOBEX 1365428525736116 1548.00 556 7 ESM3 GLOBEX 1365428525740757 1548.00 556 8 ESM3 GLOBEX 1365428525748502 1548.00 556 9 ESM3 GLOBEX 1365428525748952 1548.00 557 

    Ich bin mir nicht sicher, was der beste Weg, dies zu tun ist, aber vorausgesetzt, dass die Trennzeichen nicht in den Werten gefunden werden – es tut mir weh, mein Gehirn an die Eckkästen zu denken – dann ist so etwas nicht super-elegant Aber ist einfach:

     >>> df = pd.read_csv("esm.csv", sep=",|=", header=None) >>> df2 = df.ix[:,1::2] >>> df2.columns = list(df.ix[0,0::2]) >>> df2 symbol exchange timestamp price quantity 0 ESM3 GLOBEX 1365428525690751 1548 551 1 ESM3 GLOBEX 1365428525697183 1548 551 2 ESM3 GLOBEX 1365428525714498 1548 551 3 ESM3 GLOBEX 1365428525734967 1548 551 4 ESM3 GLOBEX 1365428525735567 1548 555 5 ESM3 GLOBEX 1365428525735585 1548 556 6 ESM3 GLOBEX 1365428525736116 1548 556 7 ESM3 GLOBEX 1365428525740757 1548 556 8 ESM3 GLOBEX 1365428525748502 1548 556 9 ESM3 GLOBEX 1365428525748952 1548 557 

    Im Grunde, lesen Sie es in, und dann die Pivot selbst, halten jedes andere Element und dann die Festsetzung der Spaltennamen.

    Python ist die beste Programmiersprache der Welt.