2013-07-19 9 views
7

Ich bin neu in Pandas und das ist meine erste Frage zu Stackoverflow, ich versuche, einige Analysen mit Pandas zu tun.Erstellen Sie einen Pandas DataFrame aus mehreren Dicts

Ich habe einige Textdateien mit Datensätzen, die ich verarbeiten möchte. Jede Zeile der Datei stimmt mit einem Datensatz überein, wobei die Felder an einem festen Ort sind und eine Länge einer festen Anzahl von Zeichen aufweisen. Es gibt verschiedene Arten von Datensätzen in derselben Datei. Alle Datensätze teilen sich das erste Feld, das je nach Datensatztyp zwei Zeichen umfasst. Als Beispiel:

Some file: 
01Jhon  Smith  555-1234           
03Cow   Bos primigenius taurus  00401     
01Jannette Jhonson   00100000000        
... 


field start length 
type   1  2 *common to all records, example: 01 = person, 03 = animal 
name   3  10 
surname  13  10 
phone  23  8 
credit  31  11 
fill of spaces 

Ich schreibe einige Code einen Datensatz in ein Wörterbuch zu konvertieren:

person1 = {'type': 01, 'name': = 'Jhon', 'surname': = 'Smith', 'phone': '555-1234'} 
person2 = {'type': 01, 'name': 'Jannette', 'surname': 'Jhonson', 'credit': 1000000.00} 
animal1 = {'type': 03, 'cname': 'cow', 'sciname': 'Bos....', 'legs': 4, 'tails': 1 } 

Wenn ein Feld im Wörterbuch leer (gefüllt mit Leerzeichen) ist da sein nicht) .

Mit allen Datensätzen einer Art möchte ich ein Pandas DataFrame mit den Dicts Keys als Spaltennamen erstellen, ich habe es mit Pandas.DataFrame.from_dict() ohne Erfolg versucht.

Und hier kommt meine Frage: Gibt es eine Möglichkeit, dies mit Pandas zu tun, so dass dict Schlüssel Spaltennamen werden? Gibt es eine andere Standardmethode, um mit dieser Art von Dateien umzugehen?

Antwort

7

Um einen Datenrahmen aus einem Wörterbuch zu machen, können Sie eine Liste der Wörterbücher passieren:

>>> person1 = {'type': 01, 'name': 'Jhon', 'surname': 'Smith', 'phone': '555-1234'} 
>>> person2 = {'type': 01, 'name': 'Jannette', 'surname': 'Jhonson', 'credit': 1000000.00} 
>>> animal1 = {'type': 03, 'cname': 'cow', 'sciname': 'Bos....', 'legs': 4, 'tails': 1 } 
>>> pd.DataFrame([person1]) 
    name  phone surname type 
0 Jhon 555-1234 Smith  1 
>>> pd.DataFrame([person1, person2]) 
    credit  name  phone surname type 
0  NaN  Jhon 555-1234 Smith  1 
1 1000000 Jannette  NaN Jhonson  1 
>>> pd.DataFrame.from_dict([person1, person2]) 
    credit  name  phone surname type 
0  NaN  Jhon 555-1234 Smith  1 
1 1000000 Jannette  NaN Jhonson  1 

Für die grundsätzlichere Frage der zwei unterschiedlich formatierte Dateien miteinander vermischt, und unter der Annahme, die Dateien nicht so groß, dass wir sie nicht lesen und im Speicher ablegen können, würde ich StringIO verwenden, um ein Objekt zu erstellen, das wie eine Datei aussieht, aber nur die gewünschten Zeilen hat, und dann read_fwf (Datei mit fester Breite) verwenden . Zum Beispiel:

from StringIO import StringIO 

def get_filelike_object(filename, line_prefix): 
    s = StringIO() 
    with open(filename, "r") as fp: 
     for line in fp: 
      if line.startswith(line_prefix): 
       s.write(line) 
    s.seek(0) 
    return s 

und dann

>>> type01 = get_filelike_object("animal.dat", "01") 
>>> df = pd.read_fwf(type01, names="type name surname phone credit".split(), 
        widths=[2, 10, 10, 8, 11], header=None) 
>>> df 
    type  name surname  phone  credit 
0  1  Jhon Smith 555-1234  NaN 
1  1 Jannette Jhonson  NaN 100000000 

funktionieren sollte. Natürlich können Sie die Dateien auch in verschiedene Typen unterteilen, bevor pandas sie jemals sieht, was am einfachsten sein könnte.

+0

Danke, die _list of_ dicts ist der Schlüssel. Die Dateien sind Hunderte von Mbs gzip komprimiert und mehrere Gbs nicht komprimiert, also wird Zeile für Zeile gelesen und an den entsprechenden DataFrame angehängt. – tinproject

Verwandte Themen