2014-11-10 20 views
6

Dire che ho un DataFrame di Pandas e voglio ottenere un elenco di tuple del modulo [(index1, column1), (index2, column2). ..] descrivendo le posizioni di tutti gli elementi di DataFrame in cui alcune condizioni sono vere. Per esempio:Ottenere coppie (indice, colonna) per gli elementi True di un DataFrame booleano in Panda

x = pd.DataFrame(np.random.normal(0, 1, (4,4)), index=['a', 'b', 'c', 'd'], 
       columns=['e', 'f', 'g', 'h']) 
x 


    e   f   g   h 
a -1.342571 -0.274879 -0.903354 -1.458702 
b -1.521502 -1.135800 -1.147913 1.829485 
c -1.199857 0.458135 -1.993701 -0.878301 
d 0.485599 0.286608 -0.436289 -0.390755 

y = x > 0 

Esiste un modo per ottenere:

x.loc[y] 

Per tornare:

[(b, h), (c,f), (d, e), (d,f)] 

O qualche equivalente? Evidentemente, posso fare:

postup = [] 
for i in x.index: 
    for j in x.columns: 
     if x.loc[i, j] > 0: 
      postup.append((i, j)) 

Ma immagino che qualcosa di meglio sia possibile/già implementato. In MATLAB la funzione trova insieme a sub2ind fa il lavoro.

risposta

8
list(x[x > 0].stack().index) 
+0

bello, molto più conciso del mio! – exp1orer

2

mio approccio utilizza MultiIndex:

#make it a multi-indexed Series 
stacked = y.stack() 

#restrict to where it's True 
true_stacked = stacked[stacked] 

#get index as a list of tuples 
result = true_stacked.index.tolist() 
2

Se si desidera un singolo tupla per ogni indice di riga:

import pandas as pd 
import numpy as np 
df = pd.DataFrame(np.random.normal(0, 1, (4,4)), index=['a', 'b', 'c', 'd'], columns=['e', 'f', 'g', 'h']) 

# build column replacement 
column_dict = {} 
for col in [{col: {True: col}} for col in df.columns]: 
    column_dict.update(col) 

# replace where > 0 
df = (df>0).replace(to_replace=column_dict) 

# convert to tuples and drop 'False' values 
[tuple(y for y in x if y != False) for x in df.to_records()] 
Problemi correlati