2014-05-14 16 views
17

Đầu tiên tôi mới tham gia gấu trúc, nhưng tôi đã yêu nó. Tôi đang cố gắng thực hiện tương đương với hàm Lag từ Oracle.Pandas tương đương với chức năng Oracle Lead/Lag

Hãy giả sử bạn có DataFrame này:

Date     Group  Data 
2014-05-14 09:10:00  A   1 
2014-05-14 09:20:00  A   2 
2014-05-14 09:30:00  A   3 
2014-05-14 09:40:00  A   4 
2014-05-14 09:50:00  A   5 
2014-05-14 10:00:00  B   1 
2014-05-14 10:10:00  B   2 
2014-05-14 10:20:00  B   3 
2014-05-14 10:30:00  B   4 

Nếu đây là một cơ sở dữ liệu oracle và tôi muốn tạo một hàm lag nhóm theo cột "Nhóm" và sắp xếp theo ngày tôi có thể dễ dàng sử dụng chức năng này :

LAG(Data,1,NULL) OVER (PARTITION BY Group ORDER BY Date ASC) AS Data_lagged 

này sẽ cho kết quả trong bảng sau:

Date     Group  Data Data lagged 
2014-05-14 09:10:00  A  1   Null 
2014-05-14 09:20:00  A  2   1 
2014-05-14 09:30:00  A  3   2 
2014-05-14 09:40:00  A  4   3 
2014-05-14 09:50:00  A  5   4 
2014-05-14 10:00:00  B  1   Null 
2014-05-14 10:10:00  B  2   1 
2014-05-14 10:20:00  B  3   2 
2014-05-14 10:30:00  B  4   3 

Trong gấu trúc, tôi có thể đặt ngày thành chỉ mục và sử dụng phương pháp thay đổi:

db["Data_lagged"] = db.Data.shift(1) 

Vấn đề duy nhất là điều này không được nhóm theo cột. Ngay cả khi tôi đặt hai cột Ngày và Nhóm làm chỉ mục, tôi vẫn sẽ nhận được "5" trong cột bị trễ.

Có cách nào để thực hiện tương đương với hàm Lead và lag trong Pandas không?

Trả lời

29

Bạn có thể thực hiện một groupby/apply (shift) operation:

In [15]: df['Data_lagged'] = df.groupby(['Group'])['Data'].shift(1) 

In [16]: df 
Out[16]: 
       Date Group Data Data_lagged 
2014-05-14 09:10:00  A  1   NaN 
2014-05-14 09:20:00  A  2   1 
2014-05-14 09:30:00  A  3   2 
2014-05-14 09:40:00  A  4   3 
2014-05-14 09:50:00  A  5   4 
2014-05-14 10:00:00  B  1   NaN 
2014-05-14 10:10:00  B  2   1 
2014-05-14 10:20:00  B  3   2 
2014-05-14 10:30:00  B  4   3 

[9 rows x 4 columns] 
+0

Thank you very much !! Đây chính xác là những gì tôi cần. – gcarmiol

Các vấn đề liên quan