Как добавить инкрементный номер в Dataframe, используя Pandas - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть исходный фрейм данных:

ID    T    value
1     0    1
1     4    3
2     0    0
2     4    1
2     7    3

Значение совпадает с предыдущей строкой.

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

ID    T    value
1     0    1
1     1    1
1     2    1
1     3    1
1     4    3
2     0    0
2     1    0
2     2    0
2     3    0
2     4    1
2     5    1
2     6    1
2     7    3
...   ...  ...

Я попытался выполнить циклдлительный процесс.

Есть идеи, как решить эту проблему для больших данных?

Спасибо!

1 Ответ

0 голосов
/ 27 сентября 2018

Для решения необходимы уникальные целочисленные значения в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...