2013-10-31 24 views
5

Sto cercando di trovare il massimo poiché la condizione era vera in un dataframe panda. Ho cercato domande simili e ho letto la documentazione, ma non sono stato in grado di trovare questo problema discusso. Per illustrare, voglio una funzione che restituirà la colonna maxsince qui sotto.Trova max da condizione in pandas timeseries dataframe

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 

Non riesco a calcolare questo senza ricorrere al ciclo. Quale sarebbe il modo più efficiente? Grazie.

+0

È df.groupby ('b'). Max() che cosa stai cercando? – Pedro9

+0

No, sto cercando qualcosa come un cummax() che si reimposta su ogni True in "b". – user2205

risposta

9

ne dite:

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

Questo funziona perché

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

ci dà un nuovo valore ogni volta che vediamo un True. Potrebbe essere necessario un po 'di patch in base a ciò che si desidera che si verifichi quando il primo valore è False, ma lo lascerò come esercizio per il lettore. ; ^)

+0

Bello. Libro di cucina degno? – TomAugspurger

+0

+1 Ho pensato di farlo con pd.rolling_apply e poi group, ma questo è ovviamente migliore –

+0

Quale versione di panda stai usando? La versione 0.12.0 mi dà l'errore ValueError: non posso convertire il float NaN in intero quando provo df ["b"]. Cumsum(). – user2205