python - 在 Pandas 中使用多索引数据帧进行高级平均

标签 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() 在这里不起作用,因为次要索引也被平均为一个值。如何进行?

最佳答案

如评论中所述,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

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

关于python - 在 Pandas 中使用多索引数据帧进行高级平均,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24954117/

相关文章:

python - tsplot 不绘图(再次)

python - 基于 2 列值的条件切片

python - 将工作日添加到日期时间列

python - 在python中使用cvxpy包构建融合套索惩罚

python - 在 Python 中使用 PhantomJS 向下滚动到无限页面的底部

python - 无法在 Ubuntu 中使用 setup.py 中的 Github Actions 安装 Tensorflow 2.2.0rc0

python - Pandas .str.replace 和不区分大小写

根据行顺序连接两个 pandas 数据框

python - 如何使用模式/均值来估算 pandas 数据框中的整个缺失值?

python : Replacing a HTML element depending on its content