Groupby 使用字典的多索引列

Posted

技术标签:

【中文标题】Groupby 使用字典的多索引列【英文标题】:Groupby multiindex columns using dictionary 【发布时间】:2021-02-11 12:39:08 【问题描述】:

在具有单个级别的 DataFrame 上,使用字典对列上的数据进行分组:

df1 = pd.DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=['a','b','c','d','e','f','g','h'])
dict_col= 'a':'ab','b':'ab','c':'c','d':'d','e':'efgh','f':'efgh','g':'efgh','h':'efgh'
df1.groupby(dict_col, axis=1).sum()
    ab          c           d           efgh
A   1.014831    1.274621    -1.490353   -0.954438
B   1.484857    -0.968642   0.700881    -3.281607
C   0.898556    1.444362    0.680974    -2.985182

在多索引数据帧上:

MultiIndex = pd.MultiIndex.from_product([['bar', 'baz', 'foo', 'qux'], ['a','b','c','d','e','f','g','h']])
df2 = pd.DataFrame(np.random.randn(3, 32), index=['A', 'B', 'C'], columns=MultiIndex)
df2.groupby(dict_col, axis=1, level=1).sum()
    ab          c           d           efgh
A   6.583721    -1.554734   1.922187    1.100208
B   6.138441    0.653721    -0.204472   1.890755
C   0.951489    2.695940    -1.494028   0.907464

如何得到这样的东西(0级的所有元素)?

    bar                                            baz                                              foo
    ab          c           d           efgh       ab           c           d           efgh        ......    
A   6.583721    -1.554734   1.922187    1.100208   4.944954     -1.343831   0.939265    -3.614612   ......
B   6.138441    0.653721    -0.204472   1.890755   -0.347505    1.633708    0.392096    0.414880    ......
C   0.951489    2.695940    -1.494028   0.907464   1.905409     -1.021097   -2.399670   0.799798    ......

【问题讨论】:

【参考方案1】:

一种方法是将函数传递给groupby,然后将元组转换回MultiIndex

out = df2.groupby(lambda x: (x[0], dict_col[x[1]]), axis=1).sum()
out.columns = pd.MultiIndex.from_tuples(out.columns)

另一种方法是在groupby 之后将列级别展平stack 然后unstack 回到groupby

df2.stack(level=0).groupby(dict_col, axis=1).sum().unstack(level=-1)

【讨论】:

以上是关于Groupby 使用字典的多索引列的主要内容,如果未能解决你的问题,请参考以下文章

多索引上的熊猫数据框 groupby

在多索引熊猫数据框中使用 groupby 时计算时间和空间梯度

在 groupby 熊猫对象上应用 rolling() 时,多索引重复

Pandas - Groupby 多索引级别,获取可能的组合,然后转换数据

错误无法处理 groupby 子句中的非唯一多索引是啥意思?

使用 pandas 连接多索引列