2013-10-31 8 views
5

Próbuję znaleźć wartość maksymalną, ponieważ warunek był prawdziwy w ramce danych pandy. Szukałem podobnych pytań i przeczytałem dokumentację, ale nie udało mi się znaleźć omawianego problemu. Aby to zilustrować, chcę funkcji, która zwróci kolumnę maxsince poniżej.Znajdź maks. Od warunku w pandas timeseries ramka danych

In [84]: df 
Out[84]: 
        a  b maxsince 
2007-04-27 11:00:00 1 True   1 
2007-04-27 11:30:00 5 False   5 
2007-04-27 12:00:00 3 False   5 
2007-04-27 12:30:00 2 True   2 
2007-04-27 13:00:00 2 False   2 
2007-04-27 13:30:00 7 True   7 
2007-04-27 14:00:00 3 False   7 
2007-04-27 14:30:00 4 False   7 

Mam problem z obliczeniem tego bez odwoływania się do pętli. Jaki byłby najbardziej efektywny sposób? Dzięki.

+0

Czy df.groupby ('b'). Max(), czego szukasz? – Pedro9

+0

Nie, szukam czegoś takiego jak cummax(), który resetuje się na każdym True w 'b'. – user2205

Odpowiedz

9

Jak o:

>>> df.groupby(df["b"].cumsum())["a"].cummax() 
2007-04-27 11:00:00 1 
      11:30:00 5 
      12:00:00 5 
      12:30:00 2 
      13:00:00 2 
      13:30:00 7 
      14:00:00 7 
      14:30:00 7 
dtype: int64 

To działa, ponieważ

>>> df["b"].cumsum() 
2007-04-27 11:00:00 1 
      11:30:00 1 
      12:00:00 1 
      12:30:00 2 
      13:00:00 2 
      13:30:00 3 
      14:00:00 3 
      14:30:00 3 
Name: b, dtype: int32 

daje nam nową wartość, gdy widzimy True. Być może będziesz musiał załatać to trochę w zależności od tego, co chcesz osiągnąć, kiedy pierwsza wartość to False, ale zostawię to jako ćwiczenie dla czytelnika. ; ^)

+0

Niezły. Książka kucharska godna? – TomAugspurger

+0

+1 Myślałem o zrobieniu tego przy pomocy pd.rolling_apply, a następnie grupowania, ale ten jest oczywiście lepszy –

+0

Jakiej wersji pandy używasz? Wersja 0.12.0 daje mi ValueError: nie mogę przekonwertować float NaN na integer, gdy próbuję df ["b"] .sumsum(). – user2205

Powiązane problemy