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
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