Для решения необходимы уникальные целочисленные значения в T
для каждой группы.
Используйте groupby
с пользовательской функцией - для каждой группы используйте reindex
и затем замените NaN
s в столбце value
на прямое заполнение ffill
:
df1 = (df.groupby('ID')['T', 'value']
.apply(lambda x: x.set_index('T').reindex(np.arange(x['T'].min(), x['T'].max() + 1)))
.ffill()
.astype(int)
.reset_index())
print (df1)
ID T value
0 1 0 1
1 1 1 1
2 1 2 1
3 1 3 1
4 1 4 3
5 2 0 0
6 2 1 0
7 2 2 0
8 2 3 0
9 2 4 1
10 2 5 1
11 2 6 1
12 2 7 3
Если вы получите ошибку:
ValueError: невозможно переиндексировать издублирующая ось
это означает, что некоторые дублированные значения для каждой группы, например:
print (df)
ID T value
0 1 0 1
1 1 4 3
2 2 0 0
3 2 4 1 <-4 is duplicates per group 2
4 2 4 3 <-4 is duplicates per group 2
5 2 7 3
Решением являются агрегированные значения, сначала для уникальных T
- например, sum
:
df = df.groupby(['ID', 'T'], as_index=False)['value'].sum()
print (df)
ID T value
0 1 0 1
1 1 4 3
2 2 0 0
3 2 4 4
4 2 7 3