2017-10-26 2 views
2

Jungen unter meinem Code, die mich mit Hilfe von Pandas Bibliothek in Python erstellt:Python Pandas erzeugt Liste von Datenrahmen

import pandas as pd 
df = pd.DataFrame({'Col1':['r0','X Y Z','A D','B','r1','r0','Y Z X','D','r1','r0','X','G','H','Z','r1']}) 

ich eine Liste von den Elementen des Datenrahmens erstellen möge. Diese Liste muss auf die interne Liste der Gruppenelemente aufgeteilt werden, die zwischen r0 und r1 sind wie in unten:

[['r0','X','Y','Z','A','D','B','r1'], 
['r0','Y','Z','X','D','r1'], 
['r0','X','G','H','Z','r1']] 

Mein Problem ist, ich das mit mehreren Schleifen tun. Dieser Weg ist jedoch für meinen Code nicht geeignet. Ich würde gerne wissen, was der einfachste Weg ist, um dieses Problem zu lösen. Danke fürs Lesen.

Antwort

2

Wenn Sie mit in Ordnung sind eine Liste von Arrays, könnten Sie str.split + stack + np.split verwenden:

df.Col1.str.split(expand=True).stack().values 
y = np.split(x, np.flatnonzero(x == 'r0'))[1:] 
y 

[array(['r0', 'X', 'Y', 'Z', 'A', 'D', 'B', 'r1'], dtype=object), 
array(['r0', 'Y', 'Z', 'X', 'D', 'r1'], dtype=object), 
array(['r0', 'X', 'G', 'H', 'Z', 'r1'], dtype=object)] 

Der Grund, warum ich [1:] aufrufen, ist, weil, da Ihre Spalte mit r0 startet, np.split ein leeres Array als die erste Aufteilung, die ich ablege, zurückgibt. Wenn dies nicht der Fall ist, können Sie es entfernen.


Als beiseite, Ihr Ergebnis auf eine Liste von Listen Umwandlung ist extrem einfach mit map:

y = list(map(np.ndarray.tolist, y)) 
+0

Vielen Dank heute hast du meine ganze Woche gespeichert. Nochmals vielen Dank :-) –

+0

@Agyol Kein Problem, wenn Sie diese Antwort (es klingt wie Sie, aber ich weiß es nicht) verwenden, sollten Sie dieses ankreuzen. –

+0

Fertig Prost :-) –

0

Sie können die zugrunde liegenden Werte Array in Teile der Länge umformen 5:

In [11]: df.Col1.values.reshape(-1, 5) 
Out[11]: 
array([['r0', 'X Y Z', 'A D', 'B', 'r1'], 
     ['r0', 'Y Z X', 'D', 'r1', 'r0'], 
     ['X', 'G', 'H', 'Z', 'r1']], dtype=object) 

Dann können Sie eine/split Liste verwenden, verbinden das Verständnis zu spalten:

In [12]: [" ".join(row).split() for row in df.Col1.values.reshape(-1, 5)] 
Out[12]: 
[['r0', 'X', 'Y', 'Z', 'A', 'D', 'B', 'r1'], 
['r0', 'Y', 'Z', 'X', 'D', 'r1', 'r0'], 
['X', 'G', 'H', 'Z', 'r1']] 
+0

Last Array ein r0 fehlt? ; -o –

+0

@Andy danke für die Antwort. Aber in der letzten, wird es nicht dauern r0 –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ hmmm, ja Missgeschick das Muster:/ –

1
import operator 
import functools 

df1=df.Col1.str.split(' ').groupby(df.Col1.eq('r0').cumsum()).apply(list).apply(lambda x : functools.reduce(operator.concat, x)) 
Out[636]: 
df1 
Col1 
1 [r0, X, Y, Z, A, D, B, r1] 
2   [r0, Y, Z, X, D, r1] 
3   [r0, X, G, H, Z, r1] 
Name: Col1, dtype: object 

df1.values 
Out[639]: 
array([['r0', 'X', 'Y', 'Z', 'A', 'D', 'B', 'r1'], 
     ['r0', 'Y', 'Z', 'X', 'D', 'r1'], ['r0', 'X', 'G', 'H', 'Z', 'r1']], dtype=object) 
Verwandte Themen