2017-06-19 8 views
0

Was meine Eingangsdaten sind:Finding bestimmte Spaltennamen und Orte in Pandas Datenrahmen

  • eine Dreiecksmatrix in einem Pandas Datenrahmen und Spaltennamen mit definierten Index
  • eine Liste mit der gleichen Länge wie die gespeicherte Anzahl der Spalten in dem Datenrahmen
  • eine Funktion, die

Was ein Element aus der Liste als Eingabe ich mag als nächstes tun:

012.351.
  • gelten die Funktion auf die Liste auf der Basis der Werte in dem Datenrahmen
  • Plot der Ergebnisse der Funktion für jedes Element aus einer anderen Liste auf der Basis der Spalten des Datenrahmen

Ein kleines Beispiel : Jetzt

scores = np.array([[1,2,1.5,0.75], 
       [0,1,0.75,1.25], 
       [0,0,1,2], 
       [0,0,0,1]]) 
names = ['Andy','Bob','Craig','Dan'] 

bets = [100,120,135,130] 

def getPrize(bet, x): # x defined somewhere elsewhere 
    prize = bet*x #do stuff here 
    return prize 

names1 = ['Andy1','Bob1','Craig1','Dan1'] 

Results = pd.DataFrame(data=scores,index=names1,columns=names1) 

definiere ich eine Bedingung auf den Werten in dem Datenrahmen und auf der Grundlage dieser Bedingung, würde ich mag die Position der entsprechenden Spalte finden (der integer-Wert als ob -conversely- I wurde mit df.iloc um es zu finden).

Was ich versuchte, war dies:

for i, r in Results.iterrows(): 
    found = r[r>1] 
    col_index = r.columns.get_loc(found) 
    print col_index 

Aber hier stehe ich vor dem Problem, dass AttributeError: 'Series' object has no attribute 'columns'. Aber wenn ich dies schreibe statt:

col_ix, col_name = found.iteritems() 

ich ValueError: need more than 1 value to unpack bekommen - so richtig verwende ich iteritems nicht? Wenn jedoch die Werte print sind, werden sie gedruckt, bevor der Fehler ausgelöst wird.

Schließlich würde ich gerne eine einzige Handlung mit dem "Preis" auf der y-Achse und den Namen auf der x-Achse haben, die ausgewählten (durch die Bedingung) Werte des Preises für jede Person (und so die andere Sache, die ich versuche zu erreichen, ist zu finden, welches Element der names Liste die Teilzeichenfolge von jedem meiner resultierenden Spaltennamen ist).

Antwort

1

Die einfachste ist nur mehrere:

print (results.mul(np.array(bets))) 
     Andy Bob Craig Dan 
Andy 100.0 240.0 202.50 97.5 
Bob  0.0 120.0 101.25 162.5 
Craig 0.0 0.0 135.00 260.0 
Dan  0.0 0.0 0.00 130.0 

Aber wenn wirkliche Funktion ist komplizierte Verwendung DataFrame.apply:

def getPrize(bet,score): 
    #working with Series score and list bets 
    print (bet) 
    print (score) 
    prize = bet*score 
    return prize 

df = results.apply(lambda x: getPrize(bets, x), axis=1) 
print (df) 

     Andy Bob Craig Dan 
Andy 100.0 240.0 202.50 97.5 
Bob  0.0 120.0 101.25 162.5 
Craig 0.0 0.0 135.00 260.0 
Dan  0.0 0.0 0.00 130.0 

plt.xticks(np.arange(len(df.columns)), df.columns) 
plt.plot(df.values) 

EDIT:

Wenn benötigten Positionen aller Spalten sind erforderlich list comprehension (oder eine Schleife), weil Index.get_loc nur mit Skalaren arbeitet:

for i, r in Results.iterrows(): 
    found = r[r>1] 
    col_index = [r.index.get_loc(x) for x in found.index] 
    print (col_index) 

[1, 2] 
[3] 
[3] 
[] 
+0

Ich sehe! Danke, gute Antwort, aber falsche Frage. Es funktioniert nicht für meine echten Daten und jetzt sehe ich warum. Ich werde die Frage bearbeiten. – durbachit

+0

Ja, ich denke über Ihre Frage nach und es hängt von Ihrer Funktion ab. Ist deine Funktion wirklich kompliziert und ist es nicht möglich Pandas oder numpy Funktion (en) ohne zu verwenden? – jezrael

+0

Wenn möglich, fügen Sie am besten die gewünschte Ausgabe hinzu, vielleicht ändern Sie auch die Eingabe für ein besseres Verständnis. Vielen Dank. – jezrael

Verwandte Themen