2014-02-27 6 views
21

Gibt es eine Möglichkeit, auf eine vorherige Zeile zurückzublicken und eine neue Variable zu berechnen? So lange die vorherige Zeile den gleichen Fall hat, was ist die (vorherige Änderung) - (aktuelle Änderung), und wird sie dem vorherigen 'ChangeEvent' in neuen Spalten zugeordnet?Wert der vorherigen Zeile erhalten und neue Spalte berechnen pandas python

hier ist mein Datenrahmen

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

Spalten hinzufügen

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

... und so weiter

hier ist die df build

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) 

Antwort

37

Der Weg zur Holen Sie sich das vorherige ist usi ng der Shift-Methode:

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] 

Jetzt können Sie diese Spalten subtrahieren. Hinweis: Dies ist mit 0.13.1 (datetime Zeug hat in letzter Zeit viel Arbeit gehabt, so YMMV mit älteren Versionen).

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] 

Sie können dies nur jeweils/Gruppe gelten:

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] 
+4

Ihre letzte kann nur sein:. '' Df.groupby ('Fall') [ 'change'] diff() '' (obwohl ich nicht glaube '' diff'' ist cythonisiert, also sollte die Geschwindigkeit gleich sein – Jeff

+0

Großartig, das ist genau das, was ich brauche. –

Verwandte Themen