python - 带有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)
您能解释一下原因并帮助我使用正确的语法吗?
解决方案
使用DataFrame.T
转置数据框并使用DataFrame.groupby
onlevel=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
推荐阅读
- python - 如何从 tf.keras.preprocessing.image_dataset_from_directory() 探索和修改创建的数据集?
- python - 如何每次用给定列表的新字符替换字符串中的字符 n 次?
- c# - C#。如何在仍然上传大型请求正文的同时处理服务器响应?
- curl - 如何使用 curl 下载 IP2Location 数据库
- javascript - 量角器中嵌套承诺的返回元素如何
- javascript - 如何从带有条件的javascript中的对象数组中获取值
- c# - 为什么将所有材料都放入 List 时,所有项目都是 null ?以及如何在淡入/淡出时更改对象位置?
- python - Pytorch NN 错误:预期输入 batch_size (64) 与目标 batch_size (30) 匹配
- mysql - 如何增量计算重复实例的数量
- flutter - 调整颤振大小时列重复