2016-12-04 3 views
1

Ich arbeite mit einem Dataset mit einer großen Anzahl von Prädiktoren und möchte einfach verschiedene zusammengesetzte Variablengruppierungen mithilfe einer Steuerdatei testen. Für den Anfang würde die Kontrolldatei angeben, ob eine Variable enthalten sein soll oder nicht. Hier ein Beispiel:Wie wählt man Spalten im Datenframe basierend auf der Suche in einem anderen?

control = pd.DataFrame({'Variable': ['Var1','Var2','Var3'], 
        'Include': [1,0,1]}) 

control 
Out[48]: 
    Include Variable 
0  1  Var1 
1  0  Var2 
2  1  Var3 

data = pd.DataFrame({'Sample':['a','b','c'], 
        'Var1': [1,0,0], 
        'Var2': [0,1,0], 
        'Var3': [0,0,1]}) 

data 
Out[50]: 
    Sample Var1 Var2 Var3 
0  a  1  0  0 
1  b  0  1  0 
2  c  0  0  1 

So das Ergebnis nach der Verarbeitung sollte ein neuer Datenrahmen sein, die wie Daten aussehen, aber fallen die Var2 Säule:

data2 
Out[51]: 
    Sample Var1 Var3 
0  a  1  0 
1  b  0  0 
2  c  0  1 

Ich kann diese erhalten, indem selektiv zu arbeiten Löschen von Spalten mit .itterows():

data2 = data.copy() 
for index, row in control.iterrows(): 
    if row['Include'] != 1: 
     z = (row['Variable']) 
     data2.drop(z, axis=1,inplace="True") 

Dies funktioniert, aber es scheint, dass es eine Möglichkeit geben, sollte dies sofort auf dem gesamten Datenrahmen zu tun. Etwas wie:

data2 = data[control['Include'] == 1] 

Dies filtert jedoch Zeilen basierend auf dem 'Include' Wert, nicht Spalten.

Alle Vorschläge geschätzt.

Antwort

2

Wählen Sie die notwendigen Header aus dem control Rahmen und intelligente Auswahl aus den data verwenden:

headers = control[control['Include']==1]['Variable'] 
all_headers = ['Sample'] + list(headers) 
data[all_headers] 
# Sample Var1 Var3 
#0  a  1  0 
#1  b  0  0 
#2  c  0  1 

A side note: Stellen Sie sich boolean True und False anstelle von 0 und 1 in der Include Spalte, wenn möglich. Umwandeln der Header auf eine Liste zuerst funktioniert der Trick -

+0

Danke @DYZ eine ziemlich schnelle Lösung mit numpy und Rekonstruktion sein. Was ist der richtige Weg, um in diesem Fall auf boolesche Werte zu testen? Immer noch == 1? – user1355179

+0

Es ist wie folgt: 'headers = control ['Include']] ['Variable']' – DyZ

0

Dies sollte

# get data columns values which is a numpy array 
dcol = data.columns.values 
# find the positions where control Include are non-zero 
non0 = np.nonzero(control.Include.values) 
# slice control.Variable to get names of Variables to include 
icld = control.Variable.values[non0] 
# search the column names of data for the included Variables 
# and the Sample column to get the positions to slice 
srch = dcol.searchsorted(np.append('Sample', icld)) 
# reconstruct the dataframe using the srch slice we've created 
pd.DataFrame(data.values[:, srch], data.index, dcol[srch]) 

enter image description here

+1

Lösungen mit rohen numpy Routinen sind viel ausführlicher und verwirren Anfänger einfach; Halten Sie sich an benutzerfreundlichere Pandas-Indexierungsroutinen (esp, da die Tags nicht nach einem numpy soln fragen) – Jeff

Verwandte Themen