python - 列上的 pandas MultiIndex 从级别 0(外部)和级别 1(内部)中选择列
问题描述
使用以下虚拟数据框:
import pandas as pd
df = pd.DataFrame({'dt':['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-03', '2020-01-01', '2020-01-02', '2020-01-03', '2020-01-03'], 'group':['a', 'a', 'b', 'b', 'a', 'a', 'b', 'b'], 'bar':[1,2,3, 4, 1,2,3, 4], 'baz':[3,4,5, 6, 3,4,5, 6]})
df = df.groupby(['dt', 'group']).describe()
即我希望能够选择df[['dt', 'group', ('bar', '25%'), , ('bar', '25%'), , ('bar', '25%')]]
.
如何执行此多级选择?
我的最终目标是能够随着时间的推移绘制每个类别的百分位数,其中每个类别描述一种颜色:
import seaborn as sns; sns.set()
sns.lineplot(data=df.reset_index()['baz'][['25%', '50%', '75%']], hue='group')
但是,在剩余的数据帧中,没有留下关于组的信息。
解决方案
不确定这是否是您所追求的:
#assigned outcome to a different variable
res = df.groupby(['dt', 'group']).describe()
#create a slicer, makes it easier to slice the multiIndex
idx = pd.IndexSlice
res.loc[idx[:],idx['bar',['25%','50%','75%']]]
你可以用它来达到同样的结果
res.loc(axis=1)['bar',['25%','50%','75%']]
bar
25% 50% 75%
dt group
2020-01-01 a 1.0 1.0 1.0
2020-01-02 a 2.0 2.0 2.0
2020-01-03 b 3.0 3.5 4.0
或横截面切片:
res.xs('bar',level=0,axis=1).filter(['25%','50%','75%'])
25% 50% 75%
dt group
2020-01-01 a 1.0 1.0 1.0
2020-01-02 a 2.0 2.0 2.0
2020-01-03 b 3.0 3.5 4.0
推荐阅读
- javascript - 无法处理角度 2+ 中的意外错误
- python - 我已经安装的 PIP 包是否已移动到我的虚拟环境中?
- java - 从 .class 文件中恢复已删除的 Spock 测试用例
- r - 潜在类别分析减少观察次数?
- jquery - 通过按钮推送到 laravel 上的 jquery ajax 返回视图返回到部分动态变化
- sqoop - 如何在 Sqoop 中动态导入表?
- apache-spark - 嵌套 json 中的结构化流式传输不同模式
- node.js - Mocha --watch 测试导致数据库错误
- amazon-web-services - 连接到不同 aws 区域中可用的 Redis
- javascript - Promise((resolve,reject)=>{}) 和 Promise(resolve =>{}) 有什么区别?