如何在dataframepython中一次添加多个日期行

2024-09-30 20:25:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有日期索引、Sales列和storenumber列的数据框。我想为缺少销售数据的商店填写缺少的销售值。你知道吗

例如,假设我想用下面10号店当年的平均销售额来填写缺失的销售值。假设我拥有的10号店2015年的销售数据是:

Sales| Store Number| Date
4000 |      10     | 2015-01-01
6000 |      10     | 2015-01-02
10000|      10     | 2016-01-01

如果这是10号店2015年的唯一销售数据,那么我将创建363个新行,对应于日期2015-01-03到2015-12-31,平均销售额(40006000)=5000。我怎样才能有效地做到这一点?你知道吗


Tags: 数据storenumberdate商店sales销售额storenumber
2条回答

这可以通过reindex来获得每个商店的所有日期,fillna用平均销售额替换丢失的日期。你知道吗

import pandas as pd
#df['Date'] = pd.to_datetime(df['Date'])

idx = pd.MultiIndex.from_product(
        [df['Store Number'].unique(),
         pd.date_range(f'{df.Date.dt.year.min()}-01-01', 
                       f'{df.Date.dt.year.max()}-12-31', freq='D')])

df = df.set_index(['Store Number', 'Date']).reindex(idx)

# Mean per year by store. 
s = df.groupby([df.index.get_level_values(0), 
                df.index.get_level_values(1).year]).transform('mean')

df['Sales'] = df[['Sales']].fillna(s)

打印(df)

#                Sales
#10 2015-01-01   4000.0
#   2015-01-02   6000.0
#   2015-01-03   5000.0
#   2015-01-04   5000.0
#   2015-01-05   5000.0
#...                ...
#   2016-12-27  10000.0
#   2016-12-28  10000.0
#   2016-12-29  10000.0
#   2016-12-30  10000.0
#   2016-12-31  10000.0
#[731 rows x 1 columns]

因为reindex是笛卡尔积,而不是慢慢地重新索引每个组,我们可以处理的商店从来没有任何销售和下降后,事实。你知道吗

m = (df['Sales'].isnull()
       .groupby([df.index.get_level_values(0), 
                 df.index.get_level_values(1).year]).transform('all'))

df = df.loc[~m]
  1. 您必须根据当前数据集,通过groupby年份和门店号找到平均销售额。你知道吗
  2. 然后计算截至年底剩余天数的平均销售额。你知道吗

它的编码应该相当简单。。你知道吗

相关问题 更多 >