熊猫:索引和列中的分组依据名称

时间:2020-04-03 10:29:27

标签: python pandas pandas-groupby

我有一个同时使用MultiIndex作为索引和列的数据框。 例如:

df = pd.DataFrame(index=pd.MultiIndex.from_product([[1,2], [1,2,3], [4,5]], names=['i','j', 'k']), columns=pd.MultiIndex.from_product([[1,2], [1,2]], names=['x', 'y']))
for c in df.columns:
    df[c] = np.random.randint(100, size=(12,1))

x       1       2
y       1   2   1   2
i j k
1 1 4  10  13   0  76
    5  92  37  52  40
  2 4  88  77  50  22
    5  75  31  19   1
  3 4  61  23   5  47
    5  43  68  10  21
2 1 4  23  15  17   5
    5  47  68   6  94
  2 4   0  12  24  54
    5  83  27  46  19
  3 4   7  22   5  15
    5   7  10  89  79

我想按索引中的名称和列中的名称对值进行分组。 对于每个这样的组,我们将有一个二维数字数组(而不是序列)。我想汇总该二维数组中所有条目的std()

例如,假设我对['i', 'x']进行分组,则一组将具有值i=1x=1。我想为每个2D数组计算std,并生成一个DataFrame,其中i的值作为索引,x的值作为列。

实现此目标的最佳方法是什么?

如果我执行stack()来获取x作为索引,由于仍然会有多列,我仍将计算多个std()而不是一个。

3 个答案:

答案 0 :(得分:1)

您可以使用stack将列的“ y”级作为索引,然后仅groupby才能获得:

print (df.stack(level='y').groupby(['i']).std())
x          1          2
i                      
1  32.966811  23.933462
2  28.668825  28.541835

答案 1 :(得分:1)

您可以使用嵌套列表推导。以您的示例为例,使用给定类型的DataFrame(这是不一样的,因为值是随机的;您可能需要修复种子值,以便结果可比),并以ix作为索引感兴趣,它将像这样工作:

# get values of the top level row index
rows = set(df.index.get_level_values(0))
# get values of the top level column index
columns = set(df.columns.get_level_values(0))

# for every sub-dataframe (every combination of top-level indices) 
# compute sampling standard deviation (1 degree of freedom) across all values
df_groupSD = pd.DataFrame([[df.loc[(row, )][(col, )].values.std(ddof=1)  
                            for col in columns] for row in rows], 
                          index = rows, columns = columns)

# show result
display(df_groupSD)  

输出:

    1           2
1   31.455115   25.433812
2   29.421699   33.748962

当然可以有更好的方法。

答案 2 :(得分:1)

尝试以下代码:

df.groupby(level=0).apply(lambda grp: grp.stack().std())