熊猫多索引平均和分组

时间:2019-12-27 18:21:50

标签: python pandas pandas-groupby

我已经为数据创建了一个嵌套字典,该字典想转换为pandas数据框,并在以后用它平均数据的某些子集。

简而言之,我从一个空字典开始

scores = {}

,然后通过遍历4个类别填充它

scores[(subdir, method, time, 'nMI')].append(nMItemp)

我将其转换为熊猫数据框

df = pd.DataFrame(scores)

看起来像这样

enter image description here

我现在想做的是,例如,将父组“ mu_0.2”和“”中的所有类别“ 0.316228 0.562341 1.000000 1.778279 3.162278 ...”之间的所有数据“ nMI”逐行平均。 moduleity_signed”。

有人可以解释如何做吗?如果此数据结构不是实现此目标的最佳方法,您能建议一个更好的方法吗?

1 个答案:

答案 0 :(得分:1)

如果要返回多索引上的特定列,则可以使用.loc。我相信这可以解决问题。选择所需的列后,即可执行.mean()。可惜我无法生成与您的数据匹配的内容。如果您可以提供具有相同结构的示例数据,那么我的示例可以适合您的情况:

df_output = df.loc[:,('mu_0.2','modularity_signed',slice(None),'nMI')]

可以在此处查看示例:

import pandas as pd
import numpy as np

arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=index)
print(df)
print(df.loc[:,(('bar','foo'),'one')])

原始数据框:

first        bar                 baz                 foo                 qux
second       one       two       one       two       one       two       one       two
A      -0.025131 -2.455114 -0.558735 -0.235553  0.250540 -1.444213  1.030049 -1.642283
B       0.558622 -1.304947 -0.457322 -1.726946  0.184681 -0.240676 -0.890618 -0.192366
C       0.345557 -0.339904  1.114021 -0.636077 -0.187887  0.472014 -0.540658 -0.527172

.loc过滤后:

first        bar       foo
second       one       one
A      -0.025131  0.250540
B       0.558622  0.184681
C       0.345557 -0.187887