gpt4 book ai didi

python - 按 pandas 中除一个索引列以外的所有内容分组

转载 作者:太空狗 更新时间:2023-10-29 22:30:20 24 4
gpt4 key购买 nike

我的数据分析反复依赖于一个简单但不可靠的主题,即“groupby everything except”。以这个多索引示例为例,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 列。所以上面的模式变得非常笨拙。最终,我正在寻找一个“丢弃”操作;我想执行一个抛出或减少单个索引列的操作。在上面的例子中,这是试用号。

我应该咬紧牙关还是有更惯用的方法来解决这个问题?这很可能是一个反模式!当谈到“真正的 Pandas 方式”时,我想建立一个体面的直觉......提前致谢。

最佳答案

你可以为此定义一个辅助函数:

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

演示:

import pandas as pd
levels = ('name', 'condition', 'trial')
names = ('john', 'hans')
conditions = list('ab')
trials = range(1, 3)

idx = pd.MultiIndex.from_product(
[names, conditions, trials], names=levels)

df = pd.DataFrame(np.random.randn(len(idx), 2),
index=idx, columns=('accuracy', 'velocity'))

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

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

关于python - 按 pandas 中除一个索引列以外的所有内容分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25606478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com