Python заполняет нули в кадре временных рядов и сохраняет существующие значения - PullRequest
2 голосов
/ 28 апреля 2019

У меня есть список дат и датафрейм.Теперь в фрейме данных есть столбец id и другие значения, которые не соответствуют всем датам.Я хочу заполнить нули во всех столбцах для идентификаторов и дат, где нет данных.Позвольте мне показать вам пример:

      date     id     clicks    conv    rev
     2019-01-21 234      34        1     10
     2019-01-21 235      32        0     0
     2019-01-24 234      56        2     20
     2019-01-23 235      23        3     30

список дат выглядит следующим образом:

     [2019-01-01, 2019-01-02,2019-01-03 ....2019-02-28]

Я хочу добавить нули для всех отсутствующих дат в кадре данных для всех идентификаторов.Таким образом, результирующий df должен выглядеть так:

    date     id     clicks    conv    rev
   2019-01-01 234      0         0     0
   2019-01-01 235      0         0     0
      .                .         .     .
      .                .         .     .

   2019-01-21 234      34        1     10
   2019-01-21 235      32        0     0
   2019-01-22 234      0         0     0
   2019-01-22 235      0         0     0
   2019-01-23 234      0         0     0
   2019-01-23 235      0         0     0
   2019-01-24 234      56        2     20
   2019-01-23 235      23        3     30
       .               .         .      .
   2019-02-28  0       0         0      0

1 Ответ

2 голосов
/ 28 апреля 2019

Используйте DataFrame.reindex с MultiIndex, также необходимо преобразовать list и столбец date в datetime s:

dates = ['2019-01-01', '2019-01-21','2019-01-22','2019-01-23', '2019-01-24']

mux = pd.MultiIndex.from_product([pd.DatetimeIndex(dates), 
                                  df['id'].unique()], names=['date','id'])

df['date'] = pd.to_datetime(df['date'])
df = df.set_index(['date','id']).reindex(mux, fill_value=0).reset_index()

print (df)
        date   id  clicks  conv  rev
0 2019-01-01  234       0     0    0
1 2019-01-01  235       0     0    0
2 2019-01-21  234      34     1   10
3 2019-01-21  235      32     0    0
4 2019-01-22  234       0     0    0
5 2019-01-22  235       0     0    0
6 2019-01-23  234       0     0    0
7 2019-01-23  235      23     3   30
8 2019-01-24  234      56     2   20
9 2019-01-24  235       0     0    0

Проверка типов:

print (df['date'].dtype)
datetime64[ns]
print (mux.levels[0].dtype)
datetime64[ns]
...