2015-03-06 9 views
9

Jeśli mam dataframe df z kolumny X i chcemy utworzyć kolumnę y na podstawie wartości x wykorzystujących to w kodzie pseudoprzypisanie vectorize warunkowego pand dataframe

if df['x'] <-2 then df['y'] = 1 
else if df['x'] > 2 then df['y']= -1 
else df['y'] = 0 

jak by to osiągnąć. Zakładam, że np.where jest najlepszym sposobem, aby to zrobić, ale nie wiem, jak poprawnie go zakodować.

+0

Uwaga, nie będzie to dodatkowy sposób to zrobić przy użyciu metody assign() w pand 16,0 (z powodu dowolnego dnia teraz?) Podobnego do dplyr mutate: http://pandas-docs.github.io/pandas-docs-travis/whatsnew.html#dataframe-assign – JohnE

Odpowiedz

14

Jeden prosty sposób byłoby najpierw przypisać wartość domyślną, a następnie wykonać 2 loc połączenia:

In [66]: 

df = pd.DataFrame({'x':[0,-3,5,-1,1]}) 
df 
Out[66]: 
    x 
0 0 
1 -3 
2 5 
3 -1 
4 1 

In [69]: 

df['y'] = 0 
df.loc[df['x'] < -2, 'y'] = 1 
df.loc[df['x'] > 2, 'y'] = -1 
df 
Out[69]: 
    x y 
0 0 0 
1 -3 1 
2 5 -1 
3 -1 0 
4 1 0 

Jeśli chcesz użyć np.where następnie można zrobić to z zagnieżdżonego np.where:

In [77]: 

df['y'] = np.where(df['x'] < -2 , 1, np.where(df['x'] > 2, -1, 0)) 
df 
Out[77]: 
    x y 
0 0 0 
1 -3 1 
2 5 -1 
3 -1 0 
4 1 0 

Więc tutaj definiujemy pierwszy warunek, gdzie x jest mniejsze niż -2, return 1, a następnie mamy inny np.where, który testuje drugi warunek, w którym x jest większe od 2 i zwraca -1, w przeciwnym razie zwraca 0

czasy

In [79]: 

%timeit df['y'] = np.where(df['x'] < -2 , 1, np.where(df['x'] > 2, -1, 0)) 

1000 loops, best of 3: 1.79 ms per loop 

In [81]: 

%%timeit 
df['y'] = 0 
df.loc[df['x'] < -2, 'y'] = 1 
df.loc[df['x'] > 2, 'y'] = -1 

100 loops, best of 3: 3.27 ms per loop 

Więc dla tego przykładowego zbioru danych metoda np.where jest dwukrotnie szybszy

+0

ma sens, dzięki – azuric

Powiązane problemy