2016-04-11 27 views
2

Ich habe ein pandas.core.frame.DataFrame explodieren, die wie folgt aussieht:Pandas Dataframe Spalt Inhalt

  0 1 
0 [1,2,3] 1 
1 [2,2,1] 1 
2 [1,2,1] 1 
... 

Die letzte Spalte ist die Markierung und jeder der Anordnungen in der Spalte ‚0‘ soll verschiedene Datenpunkte für eine bestimmte Klasse sein .

Ich möchte dies in gedreht werden:

x0 x1 x2 label 
0 1 2 3 1 
1 2 2 1 1 
2 1 2 1 1 

ich ohne Glück

ds = ds.apply(lambda x: numpy.ravel(x)) 

Das war Ergebnis der folgenden folgendes versucht haben, offensichtlich, dass nicht der richtige Weg ist zu tun Dies.

<list>.extend(zip(points,labels)) 
ds = pandas.core.frame.DataFrame(data=<list>) 

Jede Hilfe ist willkommen, wie die tatsächliche Datenmenge zu beheben oder erstellen Sie die beiden Listen (Punkte und Etiketten) korrekt ist.

Antwort

2

Hier ist, wie ich es tun würde. Entfernen Sie zuerst Ihre 1-Säule (so wir dont mess die Namensgebung):

df['id'] = df[1] 
df = df.drop(1, axis = 1) 

Dann eine objs schaffen, mit dem, was wir verketten möchten, und Concat:

objs = [df, pd.DataFrame(df[0].tolist())] 
pd.concat(objs, axis=1) 



      0 id 0 1 2 
0 [1, 2, 3] 1 1 2 3 
1 [2, 2, 1] 1 2 2 1 
2 [1, 2, 1] 1 1 2 1 
+0

Diese Lösung funktioniert am besten! Ich habe ein wenig den zweiten Teil zu: 'pd.concat ([df, pd.DataFrame (Liste (df [0]))], axis = 1)', scheint etwas besser als bei der Verwendung von '.tolist () '. Danke! – Thanos

0

Sie können Ihren Dataframe anders erstellen, um zu erhalten, was Sie wollen, anstatt zu versuchen, die Spalte zu explodieren. Siehe Code unten,

import pandas as pd 
points = [[1,2,3],[2,2,1],[1,2,1]] 
labels = [1,1,1] 
x0 = [p[0] for p in points] 
x1 = [p[1] for p in points] 
x2 = [p[2] for p in points] 
df = pd.DataFrame({'x0': x0,'x1': x1,'x2': x2, 'label': labels}) 
print (df) 

zu erhalten,

label x0 x1 x2 
0  1 1 2 3 
1  1 2 2 1 
2  1 1 2 1 
-1

Das Beste, was ich anbieten kann:

import numpy as np 
# first convert your lists to an array, then iterate 
tmp = np.array(df[0].tolist()) 

for r in np.arange(0,3): 
    df['x' + str(r)] = tmp[:,r] 
1

Ich nehme an, dass Ihre aktuellen Spaltentitel Text statt Ganzzahlen sind.

df2 = pd.concat([pd.DataFrame(zip(*df['0'])), df['1']], axis=1) 
df2.columns = ['x' + str(c) for c in df2.columns[:-1]] + ['label'] 

>>> df2 
    x0 x1 x2 label 
0 1 2 1  1 
1 2 2 2  1 
2 3 1 1  1 

zip mit dem * Operator verwendet unzips die Liste:

>>> zip(*df['0']) 
[(1, 2, 1), (2, 2, 2), (3, 1, 1)] 

So können Sie Ihre Datenrahmen erweitern:

>>> pd.DataFrame(zip(*df['0'])) 
    0 1 2 
0 1 2 1 
1 2 2 2 
2 3 1 1 

Sie brauchen dann nur noch die letzte Spalte verketten und umbenennen alle Spalten.

+0

Die Spalten sind Ganzzahlen. Als ich pd.DataFrame (zip (* ds [0])) versuchte, erhalte ich den folgenden Fehler: frame.py 283 mgr = self._init_dict ({}, Index, Spalten, dtype = dtype) 284 elif isinstance (Daten, collections.Iterator): -> 285 raise TypeError ("Datenargument kann kein Iterator sein") 286 else: 287 versuchen: TypeError: Datenargument kann kein Iterator sein. Irgendwelche Ideen? – Thanos