2016-09-19 3 views
1

My Data Frame-Ausgabe vom Lesen eines komplexen JSON sieht wie folgt aus.In den normalen Datenrahmen umwandeln, der eine Zeile als Liste hat. Teilen Sie Zeilen in Spalte

Wo einzelne Zeile eine Liste innerhalb einer einzelnen Spalte ist.

Im Folgenden finden Sie die Probe Datenrahmen (df)

col 
[A,1,3,4,Null] 
[B,4,5,6,Null] 
[C,7,8,9,Null] 

Ich habe versucht, einzelne Spalte zu spalten Pandas verwenden, aber es funktionierte nicht als einzelne Zeile selbst ist eine Liste. Ich möchte den Datenrahmen wie folgt aussehen.

colA,colB,colC,colD,colE 
A 1 3  4 Null 
B 4 5  6 Null 
C 7 8  9 Null 

Ich brauche den Spaltennamen nicht manuell angegeben, es kann automatisch generiert werden.

Antwort

1

Sie können DataFrame.from_records verwenden, aber erste verschachtelte list aus Werten von Spalte erstellen müssen col:

df = pd.DataFrame({'col':[['A',1,3,4,'Null'],['B',4,5,6,'Null'],['C',7,8,9,'Null']]}) 
print (df) 
        col 
0 [A, 1, 3, 4, Null] 
1 [B, 4, 5, 6, Null] 
2 [C, 7, 8, 9, Null] 

print (df.col.values.tolist()) 
[['A', 1, 3, 4, 'Null'], ['B', 4, 5, 6, 'Null'], ['C', 7, 8, 9, 'Null']] 

df1 = pd.DataFrame.from_records(df.col.values.tolist(), 
           columns=['colA','colB','colC','colD','colE']) 

print(df1) 
    colA colB colC colD colE 
0 A  1  3  4 Null 
1 B  4  5  6 Null 
2 C  7  8  9 Null 

Wenn Sie nicht Spaltennamen angeben muss:

df1 = pd.DataFrame.from_records(df.col.values.tolist()) 
print(df1) 
    0 1 2 3  4 
0 A 1 3 4 Null 
1 B 4 5 6 Null 
2 C 7 8 9 Null 

Timings:

#len(df) = 4k 
df = pd.concat([df]*1000).reset_index(drop=True) 

In [80]: %timeit pd.DataFrame(df['col'].apply(pd.Series).values, columns=['colA','colB','colC','colD','colE']) 
1 loop, best of 3: 753 ms per loop 

In [81]: %timeit pd.DataFrame.from_records(df.col.values.tolist(), columns=['colA','colB','colC','colD','colE']) 
100 loops, best of 3: 3.73 ms per loop 
0

Sie eine df aus dem Ergebnis der unter Verwendung von apply und pd.Series Ctor in jeder Reihe konstruieren:

In [99]: 
pd.DataFrame(df['col'].apply(pd.Series).values, columns=['colA','colB','colC','colD','colE']) 

Out[99]: 
    colA colB colC colD colE 
0 A 1 3 4 Null 
1 B 4 5 6 Null 
2 C 7 8 9 Null 
Verwandte Themen