2016-04-06 11 views
2

Let sagen, dass ich eine Tabelle in Python in folgendem Format haben:konvertieren Datentabellenformat in Python

id1 V1 100 
id1 V2 200 
id1 V3 0 
id2 V1 300 
id2 V2 400 
id2 V3 1 

und ich möchte in dieses Format konvertieren in:

id1 100 200 0 
id2 300 400 1 

V1, V2 und V3 sind Variablennamen und ich muss sie nicht behalten. Ich brauche nur IDs und die Werte jeder Variablen. Anzahl der Variablen (Vs) ist ebenfalls unbekannt, aber die Reihenfolge der Variablen ist immer gleich. Ich bin auf der Suche nach einer intelligenteren Art zu konvertieren als zu loopen. Gibt es eine eingebaute Funktion?

+0

Jede builtin wird Looping verwenden. Nein? – Signal

Antwort

3

Es gibt keine andere builtin Methode ist, aber Sie können Gruppe mit einem dict:

from collections import defaultdict 

d = defaultdict(list) 

s = """id1 V1 100 
id1 V2 200 
id1 V3 0 
id2 V1 30 
id2 V2 400 
id2 V3 1""" 

for a, _, c in map(str.split, s.splitlines()): 
     d[a].append(c) 

print(["{},{}".format(k,",".join(v)) for k,v in d.items()] 
['id2,30,400,1', 'id1,100,200,0'] 

Wenn Sie die Ausgabe gut ausgerichtet werden sollen, können Sie so etwas wie this

, wenn Sie wollen, um halten, tun können, verwenden, um eine OrderedDict:

from collections import OrderedDict 

d = OrderedDict() 

s = """id1 V1 100 
id1 V2 200 
id1 V3 0 
id2 V1 30 
id2 V2 400 
id2 V3 1""" 

for a, _, c in map(str.split, s.splitlines()): 
     d.setdefault(a, []).append(c) 

Wenn es in einer Datei ist, können Sie es mit dem cSV-lib analysieren:

import csv 
from collections import OrderedDict 
d = OrderedDict() 

with open("in.txt") as f: 
    for k, _, v in csv.reader(f, delimiter=" "): 
     d.setdefault(k, []).append(v) 

Die OrderedDict Ausgabe:

OrderedDict([('id1', ['100', '200', '0']), ('id2', ['30', '400', '1'])])