Получить математическое значение из двух последовательных строк - PullRequest
0 голосов
/ 17 октября 2018

Вот мой фрейм данных

import pandas as pd
import datetime
data = [['A1','String01',45,datetime.date(2018,1,1),datetime.date(2018,3,1)],
['A1','String02',46,datetime.date(2018,3,1),datetime.date(2018,4,29)],
['A1','String03',48,datetime.date(2018,4,29),datetime.date(2018,6,30)],
['A1','String04',51,datetime.date(2018,6,30),datetime.date(2018,12,31)],
['A2','String11',32,datetime.date(2018,1,1),datetime.date(2018,6,1)],
['A2','String12',33,datetime.date(2018,6,1),datetime.date(2018,7,30)],
['A2','String13',54,datetime.date(2018,8,11),datetime.date(2018,12,31)],
['A3','String21',45,datetime.date(2018,1,1),datetime.date(2018,6,1)],
['A3','String22',47,datetime.date(2018,7,1),datetime.date(2018,12,31)],]

cols = ['ID','SomeValue','Price','StartDate','EndDate']

df = pd.DataFrame(data,columns=cols)
print(df)

Если мы распечатали фрейм данных, мы увидим, что цена для ID = A2 отсутствует с 7/31 по 8/11 (глядя на StartDate и EndDate),У нас похожая ситуация с ID = A3

Что бы я хотел сделать, выясните StartDate - EndDate (из предыдущих столбцов), сгруппированные по ID.

Мой вывод должен выглядеть примерно так:

 ID SomeValue  Price   StartDate     EndDate  NoOfDaysMissing
0  A1  String01     45  2018-01-01  2018-03-01              NaN
1  A1  String02     46  2018-03-01  2018-04-29              0.0
2  A1  String03     48  2018-04-29  2018-06-30              0.0
3  A1  String04     51  2018-06-30  2018-12-31              0.0
4  A2  String11     32  2018-01-01  2018-06-01              NaN
5  A2  String12     33  2018-06-01  2018-07-30              0.0
6  A2  String13     54  2018-08-11  2018-12-31             12.0
7  A3  String21     45  2018-01-01  2018-06-01              NaN
8  A3  String22     47  2018-07-01  2018-12-31             30.0

, где отсутствие NoOfDays рассчитывается по StartDate - EndDate (предыдущей строки) для каждого идентификатора (сгруппированного по каждому идентификатору)

1 Ответ

0 голосов
/ 17 октября 2018

Используйте, shift, чтобы получить EndDate из предыдущей строки, возьмите разницу, затем используйте dt метод доступа с атрибутом days в пределах groupby:

df[['StartDate','EndDate']] = df[['StartDate','EndDate']].apply(pd.to_datetime)
df['NoOfDaysMissing'] = df.groupby('ID', group_keys=False)\
                          .apply(lambda x: (x['StartDate'] - x['EndDate'].shift()).dt.days)
df

OUtput:

   ID SomeValue  Price  StartDate    EndDate  NoOfDaysMissing
0  A1  String01     45 2018-01-01 2018-03-01              NaN
1  A1  String02     46 2018-03-01 2018-04-29              0.0
2  A1  String03     48 2018-04-29 2018-06-30              0.0
3  A1  String04     51 2018-06-30 2018-12-31              0.0
4  A2  String11     32 2018-01-01 2018-06-01              NaN
5  A2  String12     33 2018-06-01 2018-07-30              0.0
6  A2  String13     54 2018-08-11 2018-12-31             12.0
7  A3  String21     45 2018-01-01 2018-06-01              NaN
8  A3  String22     47 2018-07-01 2018-12-31             30.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...