2015-05-19 15 views
5

mam pandy DataFrame z tego formatuExcel jak formuł z pand

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 

w słowach, kolumny są miesiące, indeks jest user_id a każda komórka zawiera liczbę całkowitą lub NaN

Liczby oznaczają działania, które zostały podjęte, a działanie uznano za pomyślne, jeśli po upływie kolejnych miesięcy nie wymagało ono żadnych innych działań.

Moim celem jest, aby znaleźć listę udanych działań

W programie Excel, chciałbym napisać formułę takiego:

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

I byłoby przeciągnąć go do reszty kolumn, i wtedy będę miał wskaźnik, czy działanie zakończyło się sukcesem.

Jak można to zrobić skutecznie z pandami?

Próbka wyjściowa:

Na przykładzie podanym powyżej, pożądane wyjście powinno być:

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

Więc o co chodzi? Czy dla danego miesiąca jest to "NaN", a 3 poprzednie miesiące to również 'NaN'? – EdChum

+0

Musisz pokazać więcej przykładowych danych, a także dodać pożądane wyniki. Na podstawie Twojego opisu ta formuła programu Excel nie byłaby wystarczająca, ponieważ miesiąc działania może się różnić w zależności od wiersza. Tylko replikacja tej formuły excela jest bardzo łatwa w pandach z 'any()' lub 'all()'. – JohnE

+0

Interesuje mnie wskaźnik wartości 'int' z 3 następnymi' NaN's po nich, dodałem przykład. –

Odpowiedz

2

Nie jestem pewien, jak można mieć do czynienia z najbardziej po prawej kolumny (ci tylko mają), ale można dostosować dość łatwo od następnego kodu lub po prostu pad out danych z numerami zastępczych lub Nans „?”:

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

Począwszy dane 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 

Rezultaty 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 

Dla wspomnianego obicia, można dodać trzy kolumny zastępcze, a następnie modyfikować oddzielnie nieznacznie pozostały kod:

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

I teraz masz jedną "True" w ostatniej kolumnie:

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