我有一个包含时间序列数据的pandas数据框,因此该数据框的索引以每周的时间间隔为datetime64类型,每个日期发生在每个日历周的星期一。

记录订单时,数据框中只有条目,因此,如果没有下订单,则数据框中没有相应的记录。我想“填充”此数据框,以便在给定日期范围内的任何星期都包含在数据框中,并输入相应的零数量。

我设法通过创建一个虚拟数据框来使此工作正常进行,其中包括我想要的每周零数量的条目,然后合并这两个数据框并删除虚拟数据框列。这导致第三个填充数据帧。

我觉得这不是解决问题的好方法,而刚接触熊猫的熊猫想知道是否有一种更具体的或pythonic的方法来实现这一目标,而不必创建虚拟数据框然后合并。

下面是我使用的代码以获取当前的解决方案:

# Create the dummy product
# Week hold the week date of the order, want to set this as index later
group_by_product_name = df_all_products.groupby(['Week', 'Product Name'])['Qty'].sum()
first_date = group_by_product_name.head(1) # First date in entire dataset
last_date = group_by_product_name.tail().index[-1] # last date in the data set
bdates = pd.bdate_range(start=first_date, end=last_date, freq='W-MON')
qty = np.zeros(bdates.shape)
dummy_product = {'Week':bdates, 'DummyQty':qty}
df_dummy_product = pd.DataFrame(dummy_product)
df_dummy_product.set_index('Week', inplace=True)


group_by_product_name = df_all_products.groupby('Week')['Qty'].sum()
df_temp = pd.concat([df_dummy_product, group_by_product_name], axis=1, join='outer')
df_temp.fillna(0, inplace=True)
df_temp.drop(columns=['DummyQty'], axis=1, inplace=True)


这种方法的问题有时是(我不知道为什么)索引不正确匹配,我认为以某种方式在一个数据帧上的索引的dtype会丢失其类型并转到对象,而不是停留在dtype datetime64上。因此,我敢肯定有比当前解决方案更好的解决此问题的方法。

编辑

这是带有“缺少条目”的示例数据框

df1 = pd.DataFrame({'Week':['2018-05-28', '2018-06-04',
   '2018-06-11', '2018-06-25'], 'Qty':[100, 200, 300, 500]})
df1.set_index('Week', inplace=True)
df1.head()


这是一个填充数据框的示例,其中包含日期范围之间的其他缺失日期

 df_zero = pd.DataFrame({'Week':['2018-05-21', '2018-05-28', '2018-06-04',
   '2018-06-11', '2018-06-18', '2018-06-25', '2018-07-02'], 'Dummy Qty':[0, 0, 0, 0, 0, 0, 0]})
df_zero.set_index('Week', inplace=True)
df_zero.head()


这是连接两个数据框后的预期结果

df_padded = pd.concat([df_zero, df1], axis=1, join='outer')
df_padded.fillna(0, inplace=True)
df_padded.drop(columns=['Dummy Qty'], inplace=True)
df_padded.head(6)


请注意,如有必要,在最终数据帧中的其他条目之前和之间添加缺少的条目。

编辑2:

根据要求,下面是初始产品数据框的示例:

df_all_products = pd.DataFrame({'Week':['2018-05-21', '2018-05-28', '2018-05-21', '2018-06-11', '2018-06-18',
   '2018-06-25', '2018-07-02'],
                            'Product Name':['A', 'A', 'B', 'A', 'B', 'A', 'A'],
                            'Qty':[100, 200, 300, 400, 500, 600, 700]})

最佳答案

确定您的原始数据,可以通过使用pivot并在缺少的几周内重新采样来达到预期的结果,如下所示:

results = df_all_products.groupby(
    ['Week','Product Name']
)['Qty'].sum().reset_index().pivot(
    index='Week',columns='Product Name', values='Qty'
).resample('W-MON').asfreq().fillna(0)


输出结果:

Product Name    A   B
Week
2018-05-21  100.0   300.0
2018-05-28  200.0   0.0
2018-06-04  0.0     0.0
2018-06-11  400.0   0.0
2018-06-18  0.0     500.0
2018-06-25  600.0   0.0
2018-07-02  700.0   0.0


因此,如果要获取产品名称A的df,则可以执行results['A']

关于python - 扩展 Pandas 数据框以包括“缺失”周,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52739240/

10-12 21:14