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

Posted

技术标签:

【中文标题】Python 在时间序列数据框中填充零并保留现有值【英文标题】:Python fill zeros in a timeseries dataframe and keep existing values 【发布时间】: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

【问题讨论】:

your_data_frame.fillna(0) 为什么只有 0,看看 pandas.pydata.org/pandas-docs/stable/reference/api/… 和来自 sklearn.impute.SimpleImputer 请仔细阅读问题@SmartManoj 【参考方案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 - 对我来说工作得很好,将日期都转换为日期时间 - 在列表和列中? 未将列转换为日期时间。现在它正在工作。抓得好!

以上是关于Python 在时间序列数据框中填充零并保留现有值的主要内容,如果未能解决你的问题,请参考以下文章

数据框中现有值的 Python 条件 NaN 值替换

Python:如何在比较其他列时将列值填充到另一个数据框中的新列?

提取特定单元格的值并将其填充以代替 pyspark 数据框中的 NA 值

Python,如何使用字典填充数据框中的空值

用 pandas 数据框中另一列的值填充多列中的 Na

在R中的数据框中填充值?