Добавьте строки в каждую группу в кадре данных для соответствия диапазону и заполните NA предыдущим значением или нулем - PullRequest
0 голосов
/ 08 мая 2019

Мне нужно добавить пропущенные дни (как целые числа) между строками для каждой группы, а затем заполнить пропущенные значения в столбце value.

df = pd.DataFrame({'days':[0, 2, 3, 1, 3], 'group':['A', 'A', 'A', 'B', 'B'], 'value': [1.2, 2.3, 3.4, 0.2, 0.3]})

Введите:

days    group   value
0        A       1.2
2        A       2.3
3        A       3.4
1        B       0.2
3        B       0.3

Я застрял на первом шаге - добавление строк, если 0-3 отсутствует. До сих пор я пытался присоединиться к фрейму данных в серии, повторяемой для каждой группы, или переиндексировать фрейм данных.

df = df.set_index('days')
df.reindex(pd.Series(range(4)))

ValueError: cannot reindex from a duplicate axis

Ожидаемый результат:

cons_days   days    group   value
0           0        A       1.2
1           NaN      A       1.2
2           2        A       2.3
3           3        A       3.4
0           NaN      B       0.0
1           1        B       0.2
2           NaN      B       0.2
3           3        B       0.3

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Вот решение с использованием groupby:

df = (df.set_index('days')
        .groupby('group')['value']
        .apply(lambda x: x.reindex(range(0, x.index.max() + 1)))
        .reset_index()
       )

  group days value
0   A   0   1.2
1   A   1   NaN
2   A   2   2.3
3   A   3   3.4
4   B   0   NaN
5   B   1   0.2
6   B   2   NaN
7   B   3   0.3

Обновление с использованием метода заполнения @ WeNYoBen:

df = (df.set_index('days')
        .groupby('group')['value']
        .apply(lambda x: x.reindex(range(0, x.index.max() + 1)).ffill().fillna(0))
        .reset_index()
)
  group days value
0   A   0   1.2
1   A   1   1.2
2   A   2   2.3
3   A   3   3.4
4   B   0   0.0
5   B   1   0.2
6   B   2   0.2
7   B   3   0.3
1 голос
/ 08 мая 2019

Вы можете сделать с pivot, затем reindex

df.pivot(*df.columns).reindex(pd.Series(range(4))).reset_index().melt('index')
Out[222]: 
   index group  value
0      0     A    1.2
1      1     A    NaN
2      2     A    2.3
3      3     A    3.4
4      0     B    NaN
5      1     B    0.2
6      2     B    NaN
7      3     B    0.3

Обновление

df.pivot(*df.columns).reindex(pd.Series(range(4))).ffill().fillna(0).reset_index().melt('index')
Out[226]: 
   index group  value
0      0     A    1.2
1      1     A    1.2
2      2     A    2.3
3      3     A    3.4
4      0     B    0.0
5      1     B    0.2
6      2     B    0.2
7      3     B    0.3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...