使用pandas中的多索引数据框进行高级平均

时间:2014-07-25 10:53:59

标签: python pandas

在这个多索引数据框中,

               c1        c2        c3
major minor                              
a     1     -1.202766 -0.502679  1.915304
      2      0.097658  0.604051 -0.497243
      3     -1.285027 -1.200143  0.087209
d     3     -0.231444  1.518543  2.139600
      4     -1.336436 -0.299769 -0.600134
      5     -0.873389  1.949733 -0.757263
a     1     -0.222766 -2.302679  0.615304
      2      1.047648  1.304051 -1.497243
      3     -1.285027 -1.000143  0.087209
d     3     -0.631464  1.318543  0.139600
      4     -0.316436 -0.193749 -1.500134
      5     -0.693689  0.449753 -1.347263

我想得到重复主要指数的平均值,就像这样......

            c1        c2        c3
major minor                              
a     1     -1.202766 -0.502679  1.915304
      2      0.097658  0.604051 -0.497243
      3     -1.285027 -1.200143  0.087209
d     3     -0.231444  1.518543  2.139600
      4     -1.336436 -0.299769 -0.600134
      5     -0.873389  1.949733 -0.757263

其中值是平均值。显然df.groupby(level='major').mean()在这里不起作用,因为次要索引也平均为一个值。怎么办?

1 个答案:

答案 0 :(得分:0)

如评论中所述,df.groupby(level=['major', 'minor']).mean().dropna()将创建以两个轴为条件的平均值。

跟进评论中的讨论

对于具有非唯一列名称的错误数据结构案例,以下hack有效:

LL = [pd.DataFrame(pd.DataFrame(df[i]).mean(axis=1), columns=[i]) for i in df.columns.unique()]
pd.concat(LL, axis=1)

pd.DataFrame(df[i])确保df[i]DataFrame,以防列名称不是重复项。其余的只是收集数据帧然后堆叠它们。

更好的数据结构

假设您收集了不同的数据集:

 id c1 c2 c1 c2
  0  1  1  2  2
  1  3  4  5  6

更好的方法是保存样本标识符

 sample id c1 c2 
      0  0  1  1 
      1  0  2  2 
      0  1  3  4  
      1  1  5  6

现在,您拥有正确识别的多层数据,您可以在其中创建不同样本的平均值。