首页 > 解决方案 > 带有q列表的多级列MultiIndex groupby对象上的熊猫分位数

问题描述

我有一个带有 MultiIndex 列标签的 Pandas df,如下所示:

在:

import pandas as pd  
import numpy as np

np.random.seed(123)
df = pd.DataFrame(np.random.randint(100,size=(3, 4)),columns = pd.MultiIndex.from_product([['exp0','exp1'],['rnd0','rnd1']],names=['experiments','rnd_runs']))

出去:

experiments exp0      exp1     
rnd_runs    rnd0 rnd1 rnd0 rnd1
0             66   92   98   17
1             83   57   86   97
2             96   47   73   32

我想要多个分位数计算(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.groupby.DataFrameGroupBy.quantile.html)。

我可以为单个分位数计算做到这一点:

在:

df.groupby(axis='columns',level='experiments').quantile(q=0.1)  

出去:

experiments  exp0  exp1
0            68.6  25.1
1            59.6  87.1
2            51.9  36.1

但是使用 q 的列表让 Pandas 感到不安:

在:

df.groupby(axis='columns',level='experiments').quantile(q=[0.1,0.9])  

出去:


ValueError                                Traceback (most recent call last)
<ipython-input-54-86a5c92468f5> in <module>
----> 1 df.groupby(axis='columns',level='experiments').quantile(q=[0.1,0.9])

~\AppData\Local\Continuum\anaconda3\envs\suite2p\lib\site-packages\pandas\core\groupby\groupby.py in quantile(self, q, interpolation)
   1949 
   1950             # reorder rows to keep things sorted
-> 1951             indices = np.arange(len(result)).reshape([len(q), self.ngroups]).T.flatten()
   1952             return result.take(indices)
   1953 

ValueError: cannot reshape array of size 6 into shape (2,2)  
 

您能解释一下原因并帮助我使用正确的语法吗?

标签: pythonpandaspandas-groupbymulti-index

解决方案


使用DataFrame.T转置数据框并使用DataFrame.groupbyonlevel=0然后使用groupby.quantile并指定quantile要计算的值:

df1 = df.T.groupby(level=0).quantile([.1, .9]).T

结果:

print(df1)
experiments  exp0        exp1      
              0.1   0.9   0.1   0.9
0            68.6  89.4  25.1  89.9
1            59.6  80.4  87.1  95.9
2            51.9  91.1  36.1  68.9

推荐阅读