Auswählen von Zeilen in einem MultiIndexed-Datenframe

8

Ich möchte die Behälter für "S" einzeln extrahieren, wobei jede Spalte (X & amp; Y) & gt; 0,5 oder mehrere Behälter & gt; 0,5 * 'Anzahl der Zeilen'.

Im Beispiel;

für 'AR1' sollte nur bin 4 ausgewählt werden, da 'X' und 'Y' & gt; 0,5 (blau angezeigt)

für 'PO1' sollten die Fächer 1, 2, 3 und 4 ausgewählt werden, da 'X' und 'Y' & gt; (4 * 0,5) (gelb angegeben).

Ich habe das früher mit einem for loop versucht, aber das hat nicht richtig funktioniert; Mehrere (benachbarte) Zeilen bedingt auswählen

%Vor%

BEARBEITEN

Wie es aussehen sollte, ist das df wie in der Frage gezeigt, aber die Zeilen, die sich nicht qualifizieren, werden herausgefiltert. Was ich überprüfe ist das; die Werte in X und Y & gt; 0,5 für jede Zeile (Bin) einzeln oder kombiniert. Kombinationen von Zeilen nur nacheinander, 2, 3, 4 oder 5 Zeilen kombiniert.

Ie, die Kombinationen von Zeilen für 0 sind dann; 0 + 1, 0 + 1 + 2, 0 + 1 + 2 + 3 und 0 + 1 + 2 + 3 + 4. Für 1 ; 1 + 2, 1 + 2 + 3 und 1 + 2 + 3 + 4 usw.

Mehrere Zeilen summieren sich zu der Anzahl der Zeilen x 0,5, X und Y müssten & gt; 2,5 für die Zeilen 0 bis 4 zum Beispiel.

EDIT2: @JohnE und piRSquared, funktionieren beide Lösungen, welche würde jedoch besser funktionieren, wenn es im Datenframe noch andere Spalten gibt, die nicht ausgewertet werden sollten?

Außerdem, was wäre, wenn ich eine zusätzliche Bedingung in Ihren Lösungen hinzufügen möchte?

EDIT3: @piRSquared, Wenn ich einige Spalten untergeordnet bekomme, bekomme ich nur diejenigen zurück, wo ich alle brauchen würde, nicht nur die Teilmenge.

Könnten Sie helfen? Danke.

    
Zanshin 24.01.2017, 16:18
quelle

1 Antwort

3

Dies ist ein vektorisierter Ansatz mit nur einer Schleife auf der obersten Ebene ( groupby.apply )

%Vor%

%Vor%

Erklärung

Strategie

  • numpy.triu_indices : Ich muss jedes mögliche Fenster für der rollende mean größer als einige threshold . Ich werde jedes mögliche Fenster erfassen, indem ich von Position 0 bis 0 anfange, dann 0 bis 1 dann ... dann 1 zu 1, 1 zu 2 ... und so weiter. Aber ich muss immer an einer Position beginnen, bevor ich fertig bin. Ich kann auf diese Kombinationen mit numpy.triu_indices zugreifen.
  • cumsum : Es wäre ein bisschen schwierig (machbar ), um die erweiterten Arrays zu erhalten, die von jeder Kombination von Indizes angegeben werden, die ich von np.triu_indices erhalte. Ein besserer Weg ist es, cumsum zu berechnen und die Differenz von einem Index zum nächsten zu berechnen.
  • Ich muss meinem cumsum Nullen voranstellen, damit ich den Unterschied für die erste Zeile machen kann.
  • Aber Summen sind keine Mittel. Ich muss durch die Anzahl der Zeilen dividieren, um die Mittel zu erhalten. Praktischerweise ist der Unterschied zwischen den End- und Startpositionen genau die Anzahl der Reihen und somit die geeignete Anzahl, um die Summen zu teilen, um die Mittel zu berechnen.
  • Nun, da ich die Mittelwerte e / d habe, überprüfe ich, welche > threshold sind und welche Kombinationen von Start- und Endpositionen Mittelwerte haben, die größer sind als der Schwellenwert für beide Spalten.
  • Ich identifiziere dann die Kombination mit der größten Anzahl von Zeilen unter denen, die Mittel haben, die größer als der Schwellenwert sind.
  • Ich entspanne die Positionen und rekonstruiere einen Datenrahmen
  • groupby und apply ... QED

Zeittest

mit mehr Daten

%Vor%

Der Zeitunterschied ist noch dramatischer

    
piRSquared 28.01.2017, 04:44
quelle

Tags und Links