python-3.x 如何高效地对大df中最后一个多指标层的子集求和?

uqzxnwby  于 2023-02-01  发布在  Python
关注(0)|答案(1)|浏览(128)

[使用python 3.9]
我有一个大型df,其结构如下:

import pandas as pd

tuples = [('BLOCK', i, j) for i in ['X', 'Y'] for j in ['a', 'b', 'c']]
data = [[1, 1, 1, 1, 1, 2]]
columns = pd.MultiIndex.from_tuples(tuples, names=['top', 'mid', 'bottom'])
df = pd.DataFrame(columns=columns, data=data)
top    BLOCK               
mid        X        Y      
bottom     a  b  c  a  b  c
0          1  1  1  1  1  2

原始df中有许多这样的块彼此相邻,并且只有底层标签是重复的。
我想对底层的一个子集求和,删除求和后的列,用一个求和后的列替换它们,如下所示:

top    BLOCK           
mid        X      Y    
bottom     a b+c  a b+c
0          1   2  1   3

我可以通过进入每一个块和每一个中间层,对列的子集求和,然后重新索引并通过连接再次堆叠所有内容来实现这一点,但我希望有一个更有效的方法。
我想也许df.groupby(level=['top', 'mid'], axis='columns')与其他东西的组合是一个替代方案,也许通过在特定的组中分别聚合,但还没有找到方法。

js81xvg6

js81xvg61#

您可以在多索引的底层使用groupby方法,然后对底层中要聚合的子集求和。然后使用reorder_levels和swaplevel将底层移到顶层,将其删除并重命名列。最后,使用unstack将求和列移到DataFrame中的正确位置。
下面是一个例子:

grouped = df.groupby(level='bottom', axis='columns').sum()
grouped = grouped.reorder_levels([1, 0], axis='columns')
grouped = grouped.swaplevel(0, 1, axis='columns')
grouped = grouped.sum(level=0, axis='columns').rename(columns={0: 'a 
b+c'})
result = grouped.unstack().rename(columns={0: 'a b+c'})

相关问题