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

Posted

技术标签:

【中文标题】如何在单级数据框中的值上加入多级数据框【英文标题】:How to join Multi-level dataframe on values in single-level dataframe 【发布时间】:2018-05-02 08:42:06 【问题描述】:

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

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'

有什么想法吗?我只是在 groupby 周围。我还没有研究数据透视表。

请记住,问题已简化。 store_item 组合的数量是 200+K,其他 groupbys 有 300+ 列。但始终是相同的原则。

非常感谢。

【问题讨论】:

【参考方案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'])

【讨论】:

谢谢!是的,我也注意到了。我会接受你的回答,因为你打败了我:)【参考方案2】:

找到了罪魁祸首。删除了 .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')

【讨论】:

以上是关于如何在单级数据框中的值上加入多级数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何将列表中的值分配给熊猫数据框并控制每个列表元素在数据框中的分布/频率

在一个单元格中的多个可分离(连接)值上加入 R 数据框

如何通过从数据库中检索值来显示文本框中的值?

多级熊猫数据框中的总和列

如何根据数据框中的值有条件地对数据进行分组?

如何根据条件更改考拉数据框中的值