2017-09-10 3 views
2

Ich habe ein Datenframe mit einer spärlich besetzten Spalte. Die meisten Werte sind leer. Die einzigen anderen Werte sind 'Kaufen' und 'Verkaufen'. Ich möchte die leeren Werte durch "long" ersetzen, wenn der letzte nicht leere Wert "Buy" oder "short" war, wenn der letzte nicht leere Wert "Sell" war. Ich kann das leicht genug in einer Schleife machen, aber ich frage mich, ob es eine nicht-schleifeweise Möglichkeit gibt, dies zu erreichen?Ersetzen von Blindwerten im Pandas-Datenrahmen

Antwort

0

können Sie verwenden fillna oder combine_first für ersetzen None s durch Helfer erstellt df mit replace und ffill (fillna mit Methode ffill - Vorwärts-Füllung NaN s und None e):

np.random.seed(12) 
df = pd.DataFrame({'A':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6)), 
        'B':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6)), 
        'C':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6))}) 

print (df) 

     A  B  C 
0 Buy Sell None 
1 None None Buy 
2 Sell None Buy 
3 None None Buy 
4 Buy Buy Sell 
5 None None None 
6 None None None 
7 Buy None None 
8 None None Sell 
9 Buy Buy None 

df = df.fillna(df.replace({'Sell':'short', 'Buy':'long'}).ffill()) 
#alternative solution 
#df = df.combine_first(df.replace({'Sell':'short', 'Buy':'long'}).ffill()) 
print (df) 
     A  B  C 
0 Buy Sell None 
1 long short Buy 
2 Sell short Buy 
3 short short Buy 
4 Buy Buy Sell 
5 long long short 
6 long long short 
7 Buy long short 
8 long long Sell 
9 Buy Buy short 

Erläuterung:

print (df.replace({'Sell':'short', 'Buy':'long'})) 
     A  B  C 
0 long short None 
1 None None long 
2 short None long 
3 None None long 
4 long long short 
5 None None None 
6 None None None 
7 long None None 
8 None None short 
9 long long None 

print (df.replace({'Sell':'short', 'Buy':'long'}).ffill()) 
     A  B  C 
0 long short None 
1 long short long 
2 short short long 
3 short short long 
4 long long short 
5 long long short 
6 long long short 
7 long long short 
8 long long short 
9 long long short 
+0

Danke. Der erste Block Ihrer Antwort scheint genau das zu tun, was ich suche, wobei Buys und Sells erhalten bleiben und Leerzeichen durch Longs und Shorts ersetzt werden. In Ihrer Erklärung (Block 2) bestehen die Ergebnisse jedoch ausschließlich aus Longs und Short - dem Original Kauf und Verkauf sind weg. Wenn ich mir Ihren Code anschaue, wäre Letzteres das, was ich erwartet hätte. Wenn ich deinen Code versuche, bekomme ich den ersten - was ich wollte. Es sieht so aus, als ob ich die Buys durch Long und die Sells durch Short ersetze und dann einen Forward Fill tue. Aber warum werden die ursprünglichen Buys und Sells beibehalten? – dborger

+0

Weil ich "df.fillna" mit dem zweiten 'df' verwende, das durch' replace' und 'ffill' erzeugt wurde. So ersetzt es die ursprünglichen 'Nones' durch Werte in der zweiten' df.'ähnlichen Funktion 'combine_first'. – jezrael

Verwandte Themen