2013-04-11 71 views
6

Tôi muốn rút giá tại ngày mở hôm sau được lưu trữ trong (hàng + 1) và lưu trữ nó trong một cột mới, nếu một số điều kiện được đáp ứng.Đọc danh sách Pandas trong một khung dữ liệu

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

Nếu bạn muốn sử dụng kết quả của danh sách hiểu như một chỉ số, bạn nên sử dụng: 'df [[x cho x trong df ['shift'] nếu df ["MA10"]> df ["MA100"]]] ', nhưng tôi nghĩ điều này sẽ làm tăng một số ngoại lệ. Vui lòng gửi dữ liệu mẫu của bạn và kết quả mong muốn. – HYRY

+0

@HYRY Cảm ơn bạn đã bình luận. Tôi đã đăng liên kết đến dữ liệu mẫu của mình. Tôi đã sử dụng đề xuất của bạn trước khi đăng và nhận được lỗi "cú pháp không hợp lệ" như tôi đã đề cập. –

+0

@ user1374969: đếm số lượng dấu ngoặc trong đề xuất của HYRY và sau đó đếm số trong ngoặc đơn của bạn. – DSM

Trả lời

8

Có một vài cách tiếp cận. Sử dụng 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) 

trong đó sản xuất

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

Đối với một cách tiếp cận vectorized hơn, bạn có thể sử dụng

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

hoặc phương pháp ưa thích của tôi:

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

không thể cho bạn biết số tiền tôi đã đánh giá cao (trên trang web này) các đề xuất chu đáo của bạn và nhiều cách để xem cùng một câu hỏi. Cảm ơn bạn. –

+0

Đối với phương pháp # 3 tôi nhận được đối tượng chuỗi thời gian không có thuộc tính 'ở đâu' cho biết thuộc tính numpy tôi đã sử dụng np.where() với cùng một lỗi. Bạn có ý tưởng về những gì đang xảy ra không? –

+0

Bạn đang sử dụng phiên bản 'pandas' nào? Tôi đang sử dụng 0.10.1 và mã ở trên chỉ hoạt động tốt trên dữ liệu của bạn. – DSM

0

Sửa đổi của DSM Cách tiếp cận 3, trong đó nêu/giá trị False True trong np.where một cách rõ ràng:

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

Sử dụng danh sách hiểu một cách rõ ràng:

#[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))] 
Các vấn đề liên quan