python 按Pandas中除一个索引列以外的所有列分组

mgdq6dx1  于 2023-01-11  发布在  Python
关注(0)|答案(2)|浏览(139)

我的数据分析一再福尔斯一个简单但不可靠的主题,即“groupby everything except”。

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列。因此,上面的模式变得相当笨拙。最终,我将寻找一个“discard”操作;我想执行一个操作,抛出或减少一个单一的索引列。在上面的情况下,这是试验编号。
我应该咬紧牙关还是有一个更惯用的方法来处理这个问题?这很可能是一个反模式!我想建立一个体面的直觉,当谈到“真正的Pandas方式”...提前感谢。

lawou6xi

lawou6xi1#

您可以为此定义一个helper-function:

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

演示:
x一个一个一个一个x一个一个二个x
您也可以删除多个级别:

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

jaxagkaj2#

groupby的文档中,有一个示例说明如何按多索引中除一个指定列之外的所有列进行分组。它使用索引名的.difference方法:
df.groupby(level=df.index.names.difference(['name']))

相关问题