Python 具有多索引列的分组 我的目标,我期望实现它的方式,以及会发生什么

Python 具有多索引列的分组 我的目标,我期望实现它的方式,以及会发生什么,python,pandas,dataframe,pandas-groupby,multi-index,Python,Pandas,Dataframe,Pandas Groupby,Multi Index,我试图在一个数据帧上做一个groupby,这个数据帧有多个索引列,使用一个系列(没有多个索引)作为groupby的输入。具体来说,给定以下数据帧 >>> df X Y A B C A B C 2020-01-01 9 1 2 1 6 5 2020-01-02 5 7 8 0 6 9 2020-01-03 6 3 4 8 6 1 2020-01-06 0 0

我试图在一个数据帧上做一个groupby,这个数据帧有多个索引列,使用一个系列(没有多个索引)作为groupby的输入。具体来说,给定以下数据帧

>>> df
            X        Y      
            A  B  C  A  B  C
2020-01-01  9  1  2  1  6  5
2020-01-02  5  7  8  0  6  9
2020-01-03  6  3  4  8  6  1
2020-01-06  0  0  9  0  5  1
2020-01-07  8  7  4  8  3  1
以及代表组的系列

>>> groups
A    D
B    D
C    E
dtype: object
我尝试运行以下命令

>>> df.groupby(groups, axis=1, level=1).sum()
并期望得到

             X      Y   
             D  E   D  E
2020-01-01  10  2   7  5
2020-01-02  12  8   6  9
2020-01-03   9  4  14  1
2020-01-06   0  9   5  1
2020-01-07  15  4  11  1
但是,我得到了以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/zak/anaconda3/envs/lib/python3.8/site-packages/pandas/core/frame.py", line 6717, in groupby
    return DataFrameGroupBy(
  File "/home/zak/anaconda3/envs/lib/python3.8/site-packages/pandas/core/groupby/groupby.py", line 560, in __init__
    grouper, exclusions, obj = get_grouper(
  File "/home/zak/anaconda3/envs/lib/python3.8/site-packages/pandas/core/groupby/grouper.py", line 828, in get_grouper
    Grouping(
  File "/home/zak/anaconda3/envs/lib/python3.8/site-packages/pandas/core/groupby/grouper.py", line 485, in __init__
    ) = index._get_grouper_for_level(self.grouper, level)
  File "/home/zak/anaconda3/envs/lib/python3.8/site-packages/pandas/core/indexes/multi.py", line 1487, in _get_grouper_for_level
    grouper = level_values.map(mapper)
  File "/home/zak/anaconda3/envs/lib/python3.8/site-packages/pandas/core/indexes/base.py", line 5098, in map
    new_values = super()._map_values(mapper, na_action=na_action)
  File "/home/zak/anaconda3/envs/lib/python3.8/site-packages/pandas/core/base.py", line 937, in _map_values
    new_values = map_f(values, mapper)
  File "pandas/_libs/lib.pyx", line 2467, in pandas._libs.lib.map_infer
TypeError: 'numpy.ndarray' object is not callable

您可以按多索引的第二级使用
重命名
,然后按两级进行聚合:

df = df.rename(columns=groups, level=1).sum(axis=1, level=[0,1])

#working like
#df = df.rename(columns=groups, level=1).groupby(axis=1, level=[0,1]).sum()
print (df)
             X      Y   
             D  E   D  E
2020-01-01  10  2   7  5
2020-01-02  12  8   6  9
2020-01-03   9  4  14  1
2020-01-06   0  9   5  1
2020-01-07  15  4  11  1

应通过lambda函数更改您的解决方案,但输出不同:

df = df.groupby(lambda x: groups[x], axis=1, level=1).sum()
print (df)
             D   E
2020-01-01  17   7
2020-01-02  18  17
2020-01-03  23   5
2020-01-06   5  10
2020-01-07  26   5

我会接受这个答案,因为这是目前为止唯一的一个,而且比我的尝试要干净得多。然而,我仍然感到困惑,为什么这个简单的操作需要一个复杂的解决方案,包括重命名列等。?对我来说,这似乎应该是一个简单的日常操作。@ZakTurcinovic-这是一个很难回答的问题,也许对熊猫开发者来说更难。
df = df.groupby(lambda x: groups[x], axis=1, level=1).sum()
print (df)
             D   E
2020-01-01  17   7
2020-01-02  18  17
2020-01-03  23   5
2020-01-06   5  10
2020-01-07  26   5