Добавление и заполнение строк для дат в информационном фрейме по группам в pandas - PullRequest
1 голос
/ 07 января 2020

У меня есть фрейм данных, который может быть сгенерирован:

import pandas as pd
data = [['tom', 10, '20190202',5], ['nick', 15,'20190202',7], ['juli', 16,'20190203',8],
        ['tom', 17,'20190204',6], ['tom', 10,'20190204',9], ['nick', 15,'20190207',3]] 
df = pd.DataFrame(data, columns = ['Employee', 'ID','Date','Value']) 

Фрейм данных выглядит следующим образом:

enter image description here

Мне нужен вывод, подобный этому:

enter image description here

Новый кадр данных должен быть сгенерирован на основе следующего предположения: Для всех «Сотрудник» и «Идентификатор» найдена максимальная дата, и данные из предыдущей последней записи для «Сотрудника» и «Идентификатора» дублируются в строках до достижения максимальной даты.

Ответы [ 2 ]

1 голос
/ 07 января 2020

Сначала создайте DatetimeIndex с помощью DataFrame.set_index и в GroupBy.apply используйте пользовательскую лямбда-функцию с DataFrame.reindex для минимального времени / даты в группе с максимальным datetime столбца Date с пропущенными значениями для прямого заполнения:

#convert to datetimes if necessary
df['Date'] = pd.to_datetime(df['Date'])

df = (df.set_index('Date')
        .groupby(['Employee', 'ID'], sort=False)['Value']
        .apply(lambda x: x.reindex(pd.date_range(x.index.min(), 
                                                 df['Date'].max(), 
                                                 name='Date'), method='ffill'))
        .reset_index())
print (df)
   Employee  ID       Date  Value
0       tom  10 2019-02-02      5
1       tom  10 2019-02-03      5
2       tom  10 2019-02-04      9
3       tom  10 2019-02-05      9
4       tom  10 2019-02-06      9
5       tom  10 2019-02-07      9
6      nick  15 2019-02-02      7
7      nick  15 2019-02-03      7
8      nick  15 2019-02-04      7
9      nick  15 2019-02-05      7
10     nick  15 2019-02-06      7
11     nick  15 2019-02-07      3
12     juli  14 2019-02-03      8
13     juli  14 2019-02-04      8
14     juli  14 2019-02-05      8
15     juli  14 2019-02-06      8
16     juli  14 2019-02-07      8
17      tom  14 2019-02-04      6
18      tom  14 2019-02-05      6
19      tom  14 2019-02-06      6
20      tom  14 2019-02-07      6
0 голосов
/ 07 января 2020

@ jezrel ответ работает отлично. но только для того, чтобы у аудитории было несколько вариантов, добавляющих мои тоже, так как это также

df['Date']=pd.to_datetime(df['Date'])

def expand_dates(ser):
    return pd.DataFrame({'Date': pd.date_range(ser['Date'].min(), df['Date'].max(), freq='D')})

newdf = df.groupby(['Employee', 'ID']).apply(expand_dates).reset_index()\
          .merge(df, how='left')[['Employee', 'ID','Date','Value']].ffill()
...