获取上一行的值并计算新列 pandas python
有没有办法查看前一行的数据,然后计算一个新的变量?也就是说,只要前一行是相同的情况,计算(前一次的变化)减去(当前的变化),并把这个结果归到前一个'ChangeEvent'的新列里?
这是我的数据表
>>> 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
要添加的列
Jail Homeless case
0 6 1
0 30 1
0 0 1
... 还有其他的
这是数据表的构建方式
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)
2 个回答
0
除了之前的回答,我还想补充一个链接,帮助解决NaT和NaN的问题,这样你就可以得到一个连续的序列了:如何分别填充NaT和NaN值
102
获取前一个值的方法是使用 shift 方法:
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]
现在你可以对这些列进行相减。注意:这是在 0.13.1 版本下(最近关于日期时间的功能做了很多改进,所以在旧版本中可能会有所不同)。
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]
你可以把这个方法应用到每个情况/组上:
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]