2016-07-06 10 views
0

Ich versuche zu bekommen, die row und column Nummer, die erfüllt drei Bedingungen in Pandas Datenrahmen erfüllt.Getting die Zeilen- und Spaltennummern, die mehrere Bedingungen in Pandas

Ich habe einen Datenrahmen von 0, 1, -1 (größer als 1850); wenn ich versuche, die row zu bekommen und column es dauert ewig, die Ausgabe zu erhalten.

Der folgende Text ist ein Beispiel, das ich habe zu verwenden versucht:

import pandas as pd 
import numpy as np 

a = pd.DataFrame(np.random.randint(2, size=(1845,1850))) 

b = pd.DataFrame(np.random.randint(2, size=(5,1850))) 
b[b == 1] = -1 

c = pd.concat([a,b], ignore_index=True) 

column_positive = [] 
row_positive = [] 

column_negative = [] 
row_negative = [] 

column_zero = [] 
row_zero = [] 

for column in range(0, c.shape[0]): 
    for row in range(0, c.shape[1]): 
     if c.iloc[column, row] == 1: 
      column_positive.append(column) 
      row_positive.append(row) 
     elif c.iloc[column, row] == -1: 
      column_negative.append(column) 
      row_negative.append(row) 
     else: 
      column_zero.append(column) 
      row_zero.append(row) 

Ich habe einige Web-Suche und fand, dass np.where() so etwas wie dies der Fall ist, aber ich habe keine Ahnung, wie es zu tun.

Könnte jemand eine bessere Alternative sagen?

Antwort

1

Sie haben Recht np.where einen Weg, es zu tun wäre. Hier ist eine Implementierung mit ihm -

# Extract the values from c into an array for ease in further processing 
c_arr = c.values 

# Use np.where to get row and column indices corresponding to three comparisons 
column_zero, row_zero = np.where(c_arr==0) 
column_negative, row_negative = np.where(c_arr==-1) 
column_positive, row_positive = np.where(c_arr==1) 

Wenn Sie keine Zeilen und Spalten dagegen als Nx2 Formarray, können Sie es in einem wenig übersichtliche Art und Weise tun könnten, wie so -

neg_idx, zero_idx, pos_idx = [np.argwhere(c_arr == item) for item in [-1,0,1]] 
+0

Dank , @Divakar. Ich denke auch, dass Sie die Antwort mit 'np.column_stack (np.where (c.values ​​== 1))' bearbeiten können. – Akshay

+0

@akshay Oder einfach: 'np.argwhere (c_arr == 1)' usw. Das ist, was der zweite Ansatz mit 'np.argwhere' zu ​​erreichen versucht. – Divakar

+0

Stimmt, mein Schlechter. Danke trotzdem. – Akshay

Verwandte Themen