2017-09-03 1 views
-1

Ich habe einen Pandas Datenrahmen mit 3000+ Zeilen, die wie folgt aussehen:Pandas - Scheibe Abschnitte von Datenrahmen in mehrere Datenrahmen

t090:   c0S/m:    pr:      timeJ:  potemp090C:   sal00:  depSM:  \ 
407  19.3574  4.16649  1.836  189.617454      19.3571  30.3949   1.824 
408  19.3519  4.47521  1.381  189.617512      19.3517  32.9250   1.372 
409  19.3712  4.44736  0.710  189.617569      19.3711  32.6810   0.705 
410  19.3602  4.26486  0.264  189.617627      19.3602  31.1949   0.262 
411  19.3616  3.55025  0.084  189.617685      19.3616  25.4410   0.083 
412  19.2559  0.13710  0.071  189.617743      19.2559   0.7783   0.071 
413  19.2092  0.03000  0.068  189.617801      19.2092   0.1630   0.068 
414  19.4396  0.00522  0.068  189.617859      19.4396   0.0321   0.068 

Was ich tun möchte, ist: Erstellen Sie individuellen Datenrahmen von jedem Teil des Datenrahmens in wobei die Werte in der Spalte "c0S/m" 0,1 überschreiten (z. B. Zeilen 407-412 im obigen Beispiel).

Also lassen Sie uns sagen, dass ich 7 Abschnitte in meinem Datenblock 3000+ Zeile haben, in denen eine Reihe von Zeilen in der zweiten Spalte 0,1 überschreiten. Meine if/for/while-Anweisung schneidet diese Abschnitte und erstellt 7 separate Datenrahmen.

Ich habe versucht, das Beste zu erforschen, konnte aber keine Frage finden, die dieses Problem angehen würde. Jede Hilfe wird geschätzt.

Vielen Dank.

+0

seine Aufspaltung Wenn Sie „Abschnitt“ oder „Abschnitt“ sagen, werden Sie zu einer Reihe von aufeinander folgenden Zeilen beziehen, bei allen ist das Einschlusskriterium angegeben? Möchten Sie die Indizes aus dem ursprünglichen Datenrahmen beibehalten? –

+0

Ah. Ich denke du meinst getrennt in Abschnitte, in denen _consecutive_ Zeilen die Bedingung erfüllen. Recht? Das könnte schwierig sein. – Bill

+0

Sie könnten zuerst alle Zeilen aufnehmen, die die Bedingung erfüllen, und dann den Zeilenindex verwenden, um die Punkte zu finden, an denen Sie die 'Abschnittsunterbrechungen' vornehmen möchten. Ich kann mir nichts anderes vorstellen, als den Datenrahmen durchzulaufen und eine Reihe von Indexbereichen zu erstellen. – Bill

Antwort

0

Hier ist ein anderer Weg.

sub_set = df[df['c0S/m'] > 0.1] 

last = None 

for i in sub_set.index: 
    if last is None: 
     start = i 
    else: 
     if i - last > 1: 
      print start, last 
      start = i 
    last = i 

Ich denke, es funktioniert. (Anstelle von print start, last können Sie Code einfügen, um die gewünschten Slices des ursprünglichen Datenrahmens zu erstellen).

Einige nette Tricks here, die einen noch besseren Job machen.

0

Sie können dies versuchen:

zuerst eine Spalte von 0 oder 1 basierend auf hinzufügen, ob der Wert größer als 1 oder weniger.

df['splitter'] = np.where(df['c0S/m:'] > 1, 1, 0) 

Jetzt diese Spalte diff.cumsum GROUPBY()

df.groupby((df['splitter'].diff(1) != 0).astype('int').cumsum()).apply(lambda x: [x.index.min(),x.index.max()]) 

Sie erhalten die benötigten Bausteine ​​von Indizes

splitter 
1 [407, 411] 
2 [412, 414] 
3 [415, 415] 

Jetzt können Sie Datenrahmen erstellen loc mit

df.loc[407:411] 

Hinweis: Ich habe eine Zeile hinzugefügt Ihre Probe df mit:

df.loc[415] = [19.01, 5.005, 0.09, 189.62, 19.01, 0.026, 0.09] 

die Lage sein, besser zu testen und daher in 3 Gruppen

Verwandte Themen