2017-01-29 1 views
1

Ich habe eine DatenrahmenPandas letzte Zeile Wert größer wählen als

a = {'Price': [10, 15, 5, 25, 30], 'Total': [10000, 12000, 15000, 14000, 0], 
    'WAP': [10, 10.83, 9.66, 1, 1]} 
a = pd.DataFrame(a) 
print (a) 

Ich suche eine neue Spalte zu erstellen, die sagt, wenn ein [ ‚WAP‘] == 1, dann schauen auf eine [ ‚WAP‘ ] und vorherigen Wert in der Spalte zurück, die mit den Werten,

nicht 1.

So in diesem Fall ich

new = [10, 10.83, 9.66, 9.66, 9.66] 

ich habe versucht, durch die Säule laufen, aber nur in der Lage eine neue Spalte erstellen will, ist Ändere die erste 1 in eine 9.66

aw = [] 

for i in range(len(a)): 
    if a.loc[i, 'WAP'] == 1: 
     aw.append(a.loc[i-1, 'WAP']) 
    else: 
     aw.append(a.loc[i, 'WAP']) 

print (aw) 
+0

Whould Sie die Einträge neu in der bestehenden Liste hinzufügen im Verzeichniseintrag, oder möchten Sie die Liste zum Eintrag hinzufügen? – Alex

Antwort

2

Eine mögliche Lösung:

for i, row in a.iterrows(): 
    if row['WAP'] == 1: 
     a.loc[i, 'WAP'] = a.loc[i-1, 'WAP'] 
    else: 
     a.loc[i, 'WAP'] = a.loc[i,'WAP'] 
print (a) 

    Price Total WAP 
0  10 10000 10.00 
1  15 12000 10.83 
2  5 15000 9.66 
3  25 14000 9.66 
4  30  0 9.66 

Die iterative Art der Berechnung, wo die Eingaben auf die Ergebnisse der vorherigen Schritte abhängen erschwert Vektorisierung. Sie könnten vielleicht apply mit einer Funktion verwenden, die die gleiche Berechnung wie die Schleife ausführt, aber hinter den Kulissen wäre dies auch eine Schleife.

Eine andere bessere Lösung ist, ersetzen 1 durch NaN mit mask und dann ffill vorherigen Wert:

a.WAP = a.WAP.mask(a.WAP == 1).ffill() 
print (a) 
    Price Total WAP 
0  10 10000 10.00 
1  15 12000 10.83 
2  5 15000 9.66 
3  25 14000 9.66 
4  30  0 9.66 

Lösung mit replace:

a.WAP = a.WAP.replace({1:np.nan}).ffill() 
print (a) 
    Price Total WAP 
0  10 10000 10.00 
1  15 12000 10.83 
2  5 15000 9.66 
3  25 14000 9.66 
4  30  0 9.66 
+0

Das funktioniert perfekt - danke – ben121

Verwandte Themen