Как перебрать уникальный идентификатор и рассчитать разницу между значениями даты и записать значение в новый столбец - PullRequest
0 голосов
/ 15 октября 2019

У меня есть фрейм данных pandas с уникальным идентификатором, этапом и датой, связанной с этим этапом. Я хотел бы создать новый столбец, показывающий время, проведенное на этом конкретном этапе. Это означает вычитание даты для этого уникального идентификатора за вычетом даты следующего этапа, связанного с тем же идентификатором. Поскольку данные сортируются по идентификатору и этапу, последний этап записи этого идентификатора должен выдать ошибку и прочитать «текущий» или нет. Это помогает увидеть данные ниже. Я думаю, что есть способ сделать несколько для циклов, но я не уверен, как это сделать.

Я пытался создать новые столбцы перед плавлением фрейма данных, но во многих случаях следующим этапом является н / п. Это не всегда этап 1 => 2 => 3 и т. Д., Он может быть пропущен непосредственно от этапа 1 к этапу 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

1 Ответ

0 голосов
/ 15 октября 2019

Вы можете использовать sort_values + groupby для расчета различий по группам на основе идентификатора. Для расчета разницы даты конвертируются в дату и время, используя 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
...