【问题标题】:Pandas Dataframe: How to take the difference between observations with multiple observations per agent and stacked agentsPandas Dataframe:如何通过每个代理和堆叠代理的多个观察来区分观察之间的差异
【发布时间】:2019-11-03 15:40:26
【问题描述】:

我有一个 Pandas 数据框,其中包含多个个体和每个个体的多个观察值 - 下面数据框的前三列(Id、Date、Termination)。每个人的观察次数不是固定的。也就是说,有时是 1,有时是 2,有时是 3 等等。数据按如下方式堆叠(即与个人相关的所有观察结果都放在一起,并且个人相互堆叠)。

我想构建第 4 列,持续时间。如果观察不是该个体的最后一次观察,则持续时间等于下一次观察的日期减去当前观察的日期。也就是说,第一个值 267 = 1/05/2010 - 7/08/2009,第二个值 365 = 1/05/2011 - 1/05/2010。如果观察是该个人的最后一次观察,则持续时间等于终止日期减去日期。也就是说,463 的第三个值 = 6/08/2012 - 1/05/2011。

我将如何在 python 中实现这一点?抱歉,这里是 python 新手,我不知道谷歌该从什么开始...

df = pd.DataFrame({
        'ID':['AE871161', 'AE871161', 'AE871161', 'AE871164', 'AE871164', 'AE871188', 'AE871188', 'AE871188'],
        'Date':['7/08/2009', '1/05/2010', '1/05/2011', '31/07/2010', '31/07/2011', '1/06/2009', '14/06/2010', '13/06/2011'],
        'Termination':['6/08/2012', '6/08/2012', '6/08/2012', '15/07/2012', '15/07/2012', '10/06/2012', '10/06/2012', '10/06/2012']
        })

【问题讨论】:

  • 以文本而不是图像的形式发布数据。你为实现这一目标做了什么? @brb

标签: python python-3.x pandas


【解决方案1】:

我认为您需要 DataFrameGroupBy.shift 将每个组的最后缺失值替换为 Termination 列与 Series.fillna,然后将 Date 减去 Series.sub 并最后将 timedeltas 转换为天数 Series.dt.days

#convert both columns to datetimes if necessary
df[['Date','Termination']] = df[['Date','Termination']].apply(pd.to_datetime, dayfirst=True)

df['Duration'] = (df.groupby('ID')['Date'].shift(-1)
                    .fillna(df['Termination'])
                    .sub(df['Date'])
                    .dt.days)
print (df)
         ID       Date Termination  Duration
0  AE871161 2009-08-07  2012-08-06       267
1  AE871161 2010-05-01  2012-08-06       365
2  AE871161 2011-05-01  2012-08-06       463
3  AE871164 2010-07-31  2012-07-15       365
4  AE871164 2011-07-31  2012-07-15       350
5  AE871188 2009-06-01  2012-06-10       378
6  AE871188 2010-06-14  2012-06-10       364
7  AE871188 2011-06-13  2012-06-10       363

【讨论】:

  • 假设,那些不是字符串列。
猜你喜欢
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 2017-05-17
  • 2019-06-03
  • 2019-06-10
  • 1970-01-01
相关资源
最近更新 更多