【问题标题】:get previous row's value and calculate new column pandas python获取上一行的值并计算新列 pandas python
【发布时间】:2014-03-31 16:06:26
【问题描述】:

有没有办法回顾上一行并计算一个新变量?那么只要上一行是相同的情况,(previous change)-(current change)是什么,并将其归因于新列中的前一个'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

...等等

这里是 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)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    获取上一个的方法是使用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(日期时间的东西最近有很多工作,所以 YMMV 使用旧版本)。

    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]
    

    【讨论】:

    • 你的最后一个可以是:df.groupby('case')['change'].diff()(虽然我不认为diff 是cythonized,所以速度应该是一样的
    • 太好了,这正是我需要的。
    【解决方案2】:

    除了前面的回复,我会添加一个解决NaT / NaN问题的链接,所以有一个不间断的系列: How to fill NaT and NaN values separately

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多