2015-05-19 24 views
5

Tôi có một gấu trúc DataFrame với định dạng nàyExcel như công thức với gấu trúc

User_id|2014-01|2014-02|2014-03|2014-04|2014-05|...|2014-12 
1  | 7 | NaN | NaN | NaN | NaN |...| NaN 
2  | NaN | 5 | NaN | NaN | 9 |...| NaN 
3  | 2 | 4 | NaN | NaN | NaN |...| NaN 

Nói cách, các cột là tháng, chỉ số là user_id và mỗi tế bào chứa một số nguyên, hoặc NaN

Các con số đại diện cho các hành động đã được thực hiện và một hành động được coi là thành công nếu 3 tháng sau đó, không cần thực hiện hành động nào khác.

Mục tiêu của tôi là để tìm danh sách các hành động thành công

Trong Excel, tôi muốn viết một công thức như thế này:

Sheet2!E5=AND(Sheet1!E5<>"NaN",Sheet1!D5="NaN",Sheet1!C5="NaN",Sheet1!B5="NaN") 

Và sẽ kéo nó vào phần còn lại của các cột, và sau đó tôi sẽ có chỉ báo liệu một hành động có thành công hay không.

Làm thế nào điều này có thể được thực hiện hiệu quả với gấu trúc?

Mẫu đầu ra:

Đối với ví dụ đưa ra ở trên, sản lượng mong muốn nên là:

User_id|2014-01|2014-02|2014-03|2014-04|2014-05| 
1  | T | F | F | F | F | 
2  | F | F | F | F | ? | 
3  | F | T | F | F | F | 
+0

Vì vậy, sau đó bạn là gì? Cho dù trong một tháng cụ thể, nó là 'NaN' và 3 tháng trước đó cũng là' NaN'? – EdChum

+0

Bạn cần hiển thị thêm dữ liệu mẫu và cũng có thể thêm kết quả mong muốn. Dựa trên mô tả của bạn, công thức excel đó sẽ không đủ bởi vì tháng hành động có thể thay đổi từ hàng này sang hàng khác. Chỉ cần sao chép công thức excel đó là rất dễ dàng trong gấu trúc với 'any()' hoặc 'all()'. – JohnE

+0

Tôi quan tâm đến một chỉ số cho 'int' giá trị với 3 hậu quả' NaN 's sau khi họ, tôi đã thêm một ví dụ. –

Trả lời

2

Tôi không chắc chắn làm thế nào bạn muốn để đối phó với cột bên phải (bạn chỉ có '?') nhưng bạn có thể điều chỉnh khá dễ dàng bắt đầu từ mã sau hoặc chỉ cần điền dữ liệu với số phần giữ chỗ hoặc số NaN:

df2 = df.copy()  
for i in range(1,len(df.columns)): 
    df2.iloc[:,i] = ((df.iloc[:,i].notnull()) & 
        (df.iloc[:,i+1:i+4].apply(lambda x: all(x.isnull()),axis=1))) 

Bắt đầu từ dữ liệu df:

User_id 2014-01 2014-02 2014-03 2014-04 2014-05 
0  1  7  NaN  NaN  NaN  NaN 
1  2  NaN  5  NaN  NaN  9 
2  3  2  4  NaN  NaN  NaN 

Kết quả df2:

User_id 2014-01 2014-02 2014-03 2014-04 2014-05 
0  1 True False False False False 
1  2 False False False False False 
2  3 False True False False False 

Đối với đệm nói trên, bạn có thể thêm ba cột giữ chỗ và sau đó tinh chỉnh các mã còn lại một chút:

df[['pad1','pad2','pad3']] = np.nan 

df2 = df.copy().iloc[:,:-3]  
for i in range(1,len(df2.columns)): 
    df2.iloc[:,i] = ((df.iloc[:,i].notnull()) & 
        (df.iloc[:,i+1:i+4].apply(lambda x: all(x.isnull()),axis=1))) 

Và bây giờ bạn có một 'True' trong cột cuối cùng:

User_id 2014-01 2014-02 2014-03 2014-04 2014-05 
0  1 True False False False False 
1  2 False False False False True 
2  3 False True False False False 
Các vấn đề liên quan