2017-07-05 1 views
0

Toy BeispielAuswählen von Teilmenge von Multiindex Ebene

Angenommen habe ich die Datenrahmen df unten gezeigt

  C 
L0 L1 L2  
0 w P 11 
     Q 9 
     R 21 
     S 4 
    x P 3 
     Q 0 
     R 23 
     S 20 
    y P 19 
     Q 0 
     R 7 
     S 13 
    z P 17 
     Q 0 
     R 5 
     S 1 
1 w P 8 
     Q 2 
     R 12 
     S 0 
    x P 22 
     Q 14 
     R 2 
     S 18 
    y P 6 
     Q 0 
     R 16 
     S 15 
    z P 10 
     Q 0 
     R 8 
     S 0 

Beachten Sie, dass die Reihen der df von 3-stufigen Multiindex indiziert sind.

ich das Minimum der C Spalte für jeden Wert des L2 Ebene finden, wie folgt:

In [58]: df.groupby(level='L2').min() 
Out[58]: 
    C 
L2 
P 3 
Q 0 
R 2 
S 0 

In ähnlicher Weise zeigt der folgende Ausdruck die Werte von L2, für die diese Mindest größer als 0 ist:

In [59]: df.groupby(level='L2').min() > 0 
Out[59]: 
     C 
L2  
P True 
Q False 
R True 
S False 

Frage: Wie kann ich die Zeilen des ursprünglichen Datenrahmen df entsprechend den Werten o f L2 für die das Minimum von C größer als 0 ist?


In diesem einfachen Beispiel ist das Problem der Auswahl der Reihen von dfL2 dessen Wert entweder 'P' oder 'R' läuft darauf hinaus. Daher wäre es nicht schwierig, das Problem durch eine Verkettung der Zeilen für L2='P' mit denen für L2='R' zu erzwingen.

In der Anwendung, die ich im Sinn haben, aber eine solche Lösung wird unhandlich, da hier die L2 Ebene hat ~ 2000 Werte und für etwa die Hälfte von ihnen, die mindestens größer als 0

Daher ist, Ich suche nach einer besser skalierbaren Möglichkeit, dieses Auswahlproblem zu lösen.

DATA

L0 L1 L2 C 
0 w P 11 
0 w Q 9 
0 w R 21 
0 w S 4 
0 x P 3 
0 x Q 0 
0 x R 23 
0 x S 20 
0 y P 19 
0 y Q 0 
0 y R 7 
0 y S 13 
0 z P 17 
0 z Q 0 
0 z R 5 
0 z S 1 
1 w P 8 
1 w Q 2 
1 w R 12 
1 w S 0 
1 x P 22 
1 x Q 14 
1 x R 2 
1 x S 18 
1 y P 6 
1 y Q 0 
1 y R 16 
1 y S 15 
1 z P 10 
1 z Q 0 
1 z R 8 
1 z S 0 

Antwort

1

Hier ist eine Art und Weise

Shop die L2

In [413]: m = df.groupby(level='L2').min() > 0 

In [414]: m 
Out[414]: 
     C 
L2 
P True 
Q False 
R True 
S False 

verwenden, get_level_values(index_level_name).isin(to_be_filtered) Filter nur dann benötigt Werte benötigten Werte.

In [415]: df[df.index.get_level_values('L2').isin(m.loc[m.C, :].index)] 
Out[415]: 
      C 
L0 L1 L2 
0 w P 11 
     R 21 
    x P 3 
     R 23 
    y P 19 
     R 7 
    z P 17 
     R 5 
1 w P 8 
     R 12 
    x P 22 
     R 2 
    y P 6 
     R 16 
    z P 10 
     R 8 

Hier ist eine andere Art und Weise. Mit Transformation und Subgruppenauswahl

In [430]: df[(df.groupby(level='L2').transform('min') > 0).C] 
Out[430]: 
      C 
L0 L1 L2 
0 w P 11 
     R 21 
    x P 3 
     R 23 
    y P 19 
     R 7 
    z P 17 
     R 5 
1 w P 8 
     R 12 
    x P 22 
     R 2 
    y P 6 
     R 16 
    z P 10 
     R 8 

Einzelheiten

In [416]: m.loc[m.C, :].index 
Out[416]: Index([u'P', u'R'], dtype='object', name=u'L2') 
+0

Dank! BTW, 'm.loc [m.C,:]' (anstelle von 'm [m]') vermeidet das 'dropna'. – kjo

+1

Und, realisierte, dass Sie 'm' nicht brauchen können, 'Transformieren Sie Methode verwendend. – Zero

Verwandte Themen