2016-06-26 3 views
1

Ich möchte die Zeilen- und Spaltenbeschriftungen für Werte erhalten, die einer Bedingung in einem Datenrahmen entsprechen. Um es interessant zu halten, muss ich mit einem hierarchischen (Multi-) Index arbeiten. Zum Beispiel:Ruft die Zeilen- und Spaltenbeschriftungen für ausgewählte Werte in einem Pandas-Datenframe ab.

df = pd.DataFrame(np.arange(16).reshape(4, 4), columns=pd.MultiIndex.from_product((('a', 'b'), ('x', 'y')))) 

    a  b  
    x y x y 
0 0 1 2 3 
1 4 5 6 7 
2 8 9 10 11 
3 12 13 14 15 

Lassen Sie uns jetzt sagen, dass ich die Zeilen- und Spaltenbeschriftungen der Elemente wollen, wo

df % 6 == 0 

     a    b  
     x  y  x  y 
0 True False False False 
1 False False True False 
2 False False False False 
3 True False False False 

würde ich ich eine möchte bekommen

[(0, ('a', 'x')), (1, ('b', 'x')), (3, ('a', 'x'))] 

Bitte beachten allgemeine Lösung, die nicht darauf angewiesen ist, dass der Index monoton ist, oder die bestimmte Auswahl in meinem Beispiel. Diese Frage wurde oft gefragt, aber die Antworten generalisieren nicht:

Ist das wirklich so schwer in Pandas?

Antwort

2

Verwenden np.where die Ordnungsindizes der wahren Werte zu erhalten:

import numpy as np 
import pandas as pd 
df = pd.DataFrame(np.arange(16).reshape(4, 4), 
        columns=pd.MultiIndex.from_product((('a', 'b'), ('x', 'y')))) 

mask = (df % 6 == 0) 
i, j = np.where(mask) 
print(list(zip(df.index[i], df.columns[j]))) 

ergibt

[(0, ('a', 'x')), (1, ('b', 'x')), (3, ('a', 'x'))]