如何在单级数据框中的值上加入多级数据帧

时间:2017-11-18 18:54:54

标签: pandas join dataframe merge multi-index

到目前为止,我所拥有的是一个正常的事务数据框,其中包含以下列:

store | item | year | month | day | sales

'年'可以是2015年,2016年,2017年。

我创建了一个摘要数据框:

store_item_years = df.groupby(
['store','item','year'])['sales'].agg(
[np.sum, np.mean, np.std, np.median, np.min, np.max]).unstack(
fill_value=0)

最后一个导致多指数有2个级别,如下所示:

               sum                  mean
        year | 2015 | 2016 | 2017 | 2015 | 2016 | 2017 | ... 
store | item   sum1    ...   ...    mean1  mean2  ...  | ...    

现在我想将汇总表合并回事务表:

store | item | year | month | day | sales | + | sum+'by'+year | mean+'by'+year
               2015                              sum1              mean1
               2016                              sum2              mean2
               2017                              ...                ...

我正在尝试合并以下内容:

df = pd.merge(df, store_item_years, 
             left_on=['store', 'item', 'year'], 
             right_on=['store', 'item', 'year'],
             how='left')

会导致以下错误:

KeyError: 'year'

有什么想法吗?我只是围绕着群居。我还没有看过数据透视表。

请记住,问题已经简化了。 store_item组合的数量为200 + K,其他groupbys的列数为300+。但总是一样的原则。

提前多多感谢。

2 个答案:

答案 0 :(得分:1)

我认为您需要先删除unstack,然后使用join进行左连接:

store_item_years = df.groupby(
['store','item','year'])['sales'].agg(
[np.sum, np.mean, np.std, np.median, np.min, np.max])

df = df.join(store_item_years, on=['store','item','year'])

答案 1 :(得分:0)

找到了罪魁祸首。删除了.unstack()。

store_item_years = df.groupby(
   ['store','item','year'])['sales'].agg(
   [np.sum, np.mean, np.std, np.median, np.min, np.max])

以下内容保留上下文:

store_item_years.columns = store_item_years.columns+'_by_year'

并像这样合并:

pd.merge(df, store_item_years.reset_index(), 
         left_on=['store', 'item', 'year'], 
         right_on=['store', 'item', 'year'],
         how='left')