2013-04-11 16 views
6

Chciałbym wyciągnąć cenę na następny dzień, który jest obecnie przechowywany w (wiersz + 1) i zapisać go w nowej kolumnie, jeśli spełniony jest jakiś warunek.Zrozumienie listy pand w ramce danych

df['b']='' 

df['shift']='' 

df['shift']=df['open'].shift(-1) 

df['b']=df[x for x in df['shift'] if df["MA10"]>df["MA100"]] 
+1

Jeśli chcesz użyć wynik listowego jako wskaźnik, należy użyć: 'df [[x dla x w df ["przesunięcie"] jeśli df ["MA10"]> df ["MA100"]]] ", ale myślę, że spowoduje to pewien wyjątek. Proszę zamieścić swoje przykładowe dane i pożądany wynik. – HYRY

+0

@HYRY Dzięki za komentarz. Wysłałem link do moich przykładowych danych. Użyłem twojej sugestii przed opublikowaniem i otrzymałem błąd "nieprawidłową składnię", o czym wspomniałem. –

+0

@ user1374969: policz liczbę nawiasów w sugestii HYRY, a następnie policz jej liczbę. – DSM

Odpowiedz

8

Istnieje kilka podejść. Korzystanie apply:

>>> df = pd.read_csv("bondstack.csv") 
>>> df["shift"] = df["open"].shift(-1) 
>>> df["b"] = df.apply(lambda row: row["shift"] if row["MA10"] > row["MA100"] else np.nan, axis=1) 

która produkuje

>>> df[["MA10", "MA100", "shift", "b"]][:10] 
     MA10  MA100  shift   b 
0 16.915625 17.405625 16.734375  NaN 
1 16.871875 17.358750 17.171875  NaN 
2 16.893750 17.317187 17.359375  NaN 
3 16.950000 17.279062 17.359375  NaN 
4 17.137500 17.254062 18.640625  NaN 
5 17.365625 17.229063 18.921875 18.921875 
6 17.550000 17.200312 18.296875 18.296875 
7 17.681250 17.177500 18.640625 18.640625 
8 17.812500 17.159375 18.609375 18.609375 
9 17.943750 17.142813 18.234375 18.234375 

dla bardziej vectorized podejściu, można użyć

>>> df = pd.read_csv("bondstack.csv") 
>>> df["b"] = np.nan 
>>> df["b"][df["MA10"] > df["MA100"]] = df["open"].shift(-1) 

lub mój preferowany podejście:

>>> df = pd.read_csv("bondstack.csv") 
>>> df["b"] = df["open"].shift(-1).where(df["MA10"] > df["MA100"]) 
+1

nie mogę powiedzieć, jak bardzo doceniłem (na tej stronie) twoje przemyślane sugestie i wiele sposobów wyświetlania tego samego pytania. Dziękuję Ci. –

+0

Dla podejścia nr 3 otrzymuję obiekt szeregów czasowych nie ma atrybutu "gdzie" podany gdzie jest atrybut numpy Użyłem np.where() z tym samym błędem. Czy masz pojęcie o tym, co się dzieje? –

+0

Którą wersję "pand" używasz? Używam 0.10.1, a powyższy kod działa dobrze na twoich danych. – DSM

0

Modyfikacja DSM Podejście 3, stwierdzając true/wartości False np.where extenso:

#numpy.where(condition, x, y) 
df["b"] = np.where(df["MA10"] > df["MA100"], df["open"].shift(-1), np.nan) 

Korzystanie listowych extenso:

#[xv if c else yv for (c,xv,yv) in zip(condition,x,y)]  #np.where documentation 
df['b'] = [ xv if c else np.nan for (c,xv) in zip(df["MA10"]> df["MA100"], df["open"].shift(-1))] 
Powiązane problemy