obtener el valor de la fila anterior y calcular la nueva columna pandas python

¿Hay una manera de mirar hacia atrás a una fila anterior y calcular una nueva variable? de modo que mientras la fila anterior sea el mismo caso, ¿cuál es el (cambio anterior) – (cambio actual), y atribúyalo al ‘Evento de cambio’ anterior en las nuevas columnas?

Aquí está mi DataFrame

>>> df ChangeEvent StartEvent case change open 0 Homeless Homeless 1 2014-03-08 00:00:00 2014-02-08 1 other Homeless 1 2014-04-08 00:00:00 2014-02-08 2 Homeless Homeless 1 2014-05-08 00:00:00 2014-02-08 3 Jail Homeless 1 2014-06-08 00:00:00 2014-02-08 4 Jail Jail 2 2014-06-08 00:00:00 2014-02-08 

para agregar columnas

 Jail Homeless case 0 6 1 0 30 1 0 0 1 

… y así

Aquí está la comstackción df

 import pandas as pd import datetime as DT d = {'case' : pd.Series([1,1,1,1,2]), 'open' : pd.Series([DT.datetime(2014, 3, 2), DT.datetime(2014, 3, 2),DT.datetime(2014, 3, 2),DT.datetime(2014, 3, 2),DT.datetime(2014, 3, 2)]), 'change' : pd.Series([DT.datetime(2014, 3, 8), DT.datetime(2014, 4, 8),DT.datetime(2014, 5, 8),DT.datetime(2014, 6, 8),DT.datetime(2014, 6, 8)]), 'StartEvent' : pd.Series(['Homeless','Homeless','Homeless','Homeless','Jail']), 'ChangeEvent' : pd.Series(['Homeless','irrelivant','Homeless','Jail','Jail']), 'close' : pd.Series([DT.datetime(2015, 3, 2), DT.datetime(2015, 3, 2),DT.datetime(2015, 3, 2),DT.datetime(2015, 3, 2),DT.datetime(2015, 3, 2)])} df=pd.DataFrame(d) 

La forma de obtener el anterior es usando el método de cambio:

 In [11]: df1.change.shift(1) Out[11]: 0 NaT 1 2014-03-08 2 2014-04-08 3 2014-05-08 4 2014-06-08 Name: change, dtype: datetime64[ns] 

Ahora puedes restar estas columnas. Nota: Esto es con 0.13.1 (las cosas de fecha y hora han tenido mucho trabajo recientemente, así que YMMV con versiones anteriores).

 In [12]: df1.change.shift(1) - df1.change Out[12]: 0 NaT 1 -31 days 2 -30 days 3 -31 days 4 0 days Name: change, dtype: timedelta64[ns] 

Simplemente puede aplicar esto a cada caso / grupo:

 In [13]: df.groupby('case')['change'].apply(lambda x: x.shift(1) - x) Out[13]: 0 NaT 1 -31 days 2 -30 days 3 -31 days 4 NaT dtype: timedelta64[ns]