Python在时间序列数据框中填充零并保留现有值

时间:2019-04-28 17:01:34

标签: python pandas time-series pandas-groupby

我有一个日期列表和一个数据框。现在,数据框具有一个id列和其他对于所有日期都不一致的值。我想在没有数据的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]

我想要的是为所有ID的数据框中的所有缺失日期添加零。因此,生成的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 个答案:

答案 0 :(得分:2)

DataFrame.reindexMultiIndex一起使用,也有必要将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

验证dtypes

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