【问题标题】:Python fill zeros in a timeseries dataframe and keep existing valuesPython 在时间序列数据框中填充零并保留现有值
【发布时间】:2019-09-17 10:39:15
【问题描述】:

我有一个日期列表和一个数据框。现在数据框有一个 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

【问题讨论】:

标签: python pandas time-series pandas-groupby


【解决方案1】:

使用DataFrame.reindexMultiIndex,也需要将list 和列date 转换为datetimes:

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]

【讨论】:

  • 这段代码会保留现有的非零值吗?我有一个类似的代码,但它对所有日期都复制零
  • @Nofy - print (df.info()) 是什么?
  • 数据列(共 11 列):dtypes: float64(2), int64(7), object(2) 是的,我验证了,我的解决方案也全为零
  • @Nofy - 对我来说工作得很好,将日期都转换为日期时间 - 在列表和列中?
  • 未将列转换为日期时间。现在它正在工作。抓得好!
猜你喜欢
  • 2019-09-16
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 2019-11-18
  • 2015-12-03
  • 1970-01-01
  • 2021-08-07
  • 2019-04-16
相关资源
最近更新 更多