Python 按所有项分组,但熊猫中的一个索引列除外

Python 按所有项分组,但熊猫中的一个索引列除外,python,pandas,dataframe,Python,Pandas,Dataframe,我的数据分析一再回到一个简单但不确定的主题上,即“除此之外的一切都按分组”。以多索引为例,df: accuracy velocity name condition trial john a 1 -1.403105 0.419850 2 -0.879487 0.141615 b 1 0.880945 1.951

我的数据分析一再回到一个简单但不确定的主题上,即“除此之外的一切都按分组”。以多索引为例,
df

                      accuracy  velocity
name condition trial                    
john a         1     -1.403105  0.419850
               2     -0.879487  0.141615
     b         1      0.880945  1.951347
               2      0.103741  0.015548
hans a         1      1.425816  2.556959
               2     -0.117703  0.595807
     b         1     -1.136137  0.001417
               2      0.082444 -1.184703
例如,我现在想做的是,在保留姓名和病情信息的同时,对所有可用的试验进行平均。这很容易做到:

average = df.groupby(level=('name', 'condition')).mean()
然而,在现实世界中,多索引中存储的元数据要多得多。索引很容易跨越每行8-10列。因此,上面的模式变得相当笨拙。最终,我在寻找一个“丢弃”操作;我想执行一个抛出或减少单个索引列的操作。在上述案例中,这是审判编号


我应该咬紧牙关,还是有更惯用的方法?这很可能是一种反模式!我想建立一个体面的直觉,当谈到“真正的熊猫方式”。。。提前感谢。

您可以为此定义帮助函数:

def allbut(*names):
    names = set(names)
    return [item for item in levels if item not in names]
演示:


您也可以删除多个级别:

In [53]: df.groupby(level=allbut('name', 'trial')).mean()
Out[53]: 
           accuracy  velocity
condition                    
a         -0.597178 -0.370377
b         -0.126996 -0.037003

这看起来不错;我一直在使用类似的东西。你认为图案本身是正确的吗?是否有一种更“内置”的方法来实现相同的结果?有一系列不同的变体,例如
df.groupby(level=list(set(levels)-{'name'})).mean()
,但我认为它们基本上是一样的——特别是对于少数级别。我认为没有更“内置”的方法,因此定义助手函数是使代码看起来可读的最佳方法。
In [40]: df.groupby(level=allbut('condition')).mean()
Out[40]: 
            accuracy  velocity
trial name                    
1     hans  0.086303  0.131395
      john  0.454824 -0.259495
2     hans -0.234961 -0.626495
      john  0.614730 -0.144183
In [53]: df.groupby(level=allbut('name', 'trial')).mean()
Out[53]: 
           accuracy  velocity
condition                    
a         -0.597178 -0.370377
b         -0.126996 -0.037003