【问题标题】:How to iterate through unique ID and calculate difference between date values and write value to a new column如何遍历唯一 ID 并计算日期值之间的差异并将值写入新列
【发布时间】:2019-10-14 21:30:02
【问题描述】:

我有一个带有唯一 ID、阶段和与该阶段关联的日期的 pandas 数据框。我想创建一个新列,显示在该特定阶段花费的时间。这意味着减去该唯一 ID 的日期减去与该相同 ID 关联的下一阶段的日期。由于数据是按 ID 和阶段排序的,该 ID 记录的最后阶段应该出错并读取“当前”或 n/a。它有助于查看下面的数据。我在想有一种方法可以执行多个 for 循环,但我不确定如何执行此操作。

我曾尝试在融合数据框之前创建新列,但在很多情况下下一阶段是不适用。不一定是stage 1=>2=>3等,可以直接从stage 1跳到stage 3。

   example.describe

   Opportunity_ID  stage      value
   0061R00000l43xP    1.0 2018-11-07
   0061R00000lUT5r    1.0 2019-05-02
   0061R00000lUT5r    2.0 2019-05-22
   0061R00000lUT5r    3.0 2019-06-03
   80061R0000lUT5r    5.0 2019-06-20
   0061R00000lUT5r    5.5 2019-09-10
   0061R00000lXwZL    1.0 2018-12-05
   0061R00000lXwZL    4.0 2019-04-09
   0061R00000lXwZL    5.0 2019-04-19
   0061R00000lXwZL    5.5 2019-04-19
   0061R00000lXwZL    8.0 2019-05-03
   0061R00000lXwZL    9.0 2019-07-09
   0061R00000lXwZL   11.0 2019-08-02
   0061R00000lY4Vm    1.0 2018-12-06
   0061R00000lY4Vm    2.0 2019-09-26
   0061R00000lrOGm    3.0 2019-02-15
   0061R00000lrOGm    4.0 2019-09-18


  [793 rows x 3 columns]>

  example.dtypes
  Opportunity_ID            object
  stage                    float64
  value             datetime64[ns]
  dtype: object

【问题讨论】:

    标签: python pandas dataframe for-loop pivot


    【解决方案1】:

    您可以使用sort_values + groupby 根据 ID 按组计算差异。 为了计算差异,使用pd.to_datetime 将日期转换为日期时间。:

    df['value']=pd.to_datetime(df['value'])
    df=df.sort_values(['Opportunity_ID','stage'])
    df['difference']=df.groupby('Opportunity_ID')['value'].diff(-1)
    print(df)
    

         Opportunity_ID  stage      value difference
    0   0061R00000l43xP    1.0 2018-11-07        NaT
    1   0061R00000lUT5r    1.0 2019-05-02   -20 days
    2   0061R00000lUT5r    2.0 2019-05-22   -12 days
    3   0061R00000lUT5r    3.0 2019-06-03   -99 days
    5   0061R00000lUT5r    5.5 2019-09-10        NaT
    6   0061R00000lXwZL    1.0 2018-12-05  -125 days
    7   0061R00000lXwZL    4.0 2019-04-09   -10 days
    8   0061R00000lXwZL    5.0 2019-04-19     0 days
    9   0061R00000lXwZL    5.5 2019-04-19   -14 days
    10  0061R00000lXwZL    8.0 2019-05-03   -67 days
    11  0061R00000lXwZL    9.0 2019-07-09   -24 days
    12  0061R00000lXwZL   11.0 2019-08-02        NaT
    13  0061R00000lY4Vm    1.0 2018-12-06  -294 days
    14  0061R00000lY4Vm    2.0 2019-09-26        NaT
    15  0061R00000lrOGm    3.0 2019-02-15  -215 days
    16  0061R00000lrOGm    4.0 2019-09-18        NaT
    4   80061R0000lUT5r    5.0 2019-06-20        NaT
    

    订购可能对您不方便。 您可以在不预先排序值的情况下计算它。这将是您示例的结果:

    df['value']=pd.to_datetime(df['value'])
    df['difference']=df.groupby('Opportunity_ID')['value'].diff(-1)
    print(df)
    
        Opportunity_ID  stage      value difference
    0   0061R00000l43xP    1.0 2018-11-07        NaT
    1   0061R00000lUT5r    1.0 2019-05-02   -20 days
    2   0061R00000lUT5r    2.0 2019-05-22   -12 days
    3   0061R00000lUT5r    3.0 2019-06-03   -99 days
    4   80061R0000lUT5r    5.0 2019-06-20        NaT
    5   0061R00000lUT5r    5.5 2019-09-10        NaT
    6   0061R00000lXwZL    1.0 2018-12-05  -125 days
    7   0061R00000lXwZL    4.0 2019-04-09   -10 days
    8   0061R00000lXwZL    5.0 2019-04-19     0 days
    9   0061R00000lXwZL    5.5 2019-04-19   -14 days
    10  0061R00000lXwZL    8.0 2019-05-03   -67 days
    11  0061R00000lXwZL    9.0 2019-07-09   -24 days
    12  0061R00000lXwZL   11.0 2019-08-02        NaT
    13  0061R00000lY4Vm    1.0 2018-12-06  -294 days
    14  0061R00000lY4Vm    2.0 2019-09-26        NaT
    15  0061R00000lrOGm    3.0 2019-02-15  -215 days
    16  0061R00000lrOGm    4.0 2019-09-18        NaT
    

    【讨论】:

    • 谢谢!此代码按预期工作,是解决我的问题的好方法。如果我没有根据开始日期订购,python 如何识别我想按该顺序减去日期?其次,您介意解释一下 .dff(-1) 是如何识别我只想在应用于分组的地方减去前一行的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2017-08-22
    • 2023-01-16
    • 1970-01-01
    • 2019-03-27
    • 2019-09-25
    相关资源
    最近更新 更多