重塑MultiIndex以分离

时间:2016-11-12 16:15:23

标签: python pandas multi-index

在阅读了熊猫和MultiIndex的文档后,这里的帖子很多,我还是没有完全掌握这个概念。有人可以帮我找到这一行代码。

我想根据xls文件中的数据创建一个箱形图。线索是显示两个箱图,一个用于参数= 33,一个用于参数= 77。所以我的数据集需要按参数分割结果。由于我没有完全理解这个概念,因此任何以卸载的尝试都会失败。

# -*- coding: utf-8 -*-
import pandas
import numpy as np
wbName= "Test (1).xlsx"
wsName = "Sheet1"
sort_by=['Name','Parameter']
df = pandas.read_excel(open(wbName, "rb"), sheetname=wsName)
id_col=list()
for sb in sort_by:
    id_col.append(np.where(df.columns.values==sb)[0][0])
df = pandas.read_excel(open(wbName, "rb"), sheetname=wsName, index_col=id_col)
print(df)
#oneline magic needed
df.plot.box()

因此print(df)返回(如预期的那样)

Name Parameter        
sdf  33             99
     33             99
     33             99
     33            645
     33            345
     77            567
     77             45
     77            456
     77            456
     77            234
     77            576
     77             45
ere  33             99
     33             99
     33             99
     33            645
     33            345
     77            567
     77             45
     77            456
     77            456
     77            234
     77            576
     77             45

但是我认为我只需要一行就可以进入(数字不会超过exaple)

Result             
Parameter        33   77
Name         
sdf               99   567
                  99   45
                  99   456
                 645   456
                 345   456 
ere               99   546 
                  99  465
                  99  456 
                 645  46 

1 个答案:

答案 0 :(得分:1)

问题是您的pd.MultiIndex并非唯一。

假设您的系列为s

df = pd.DataFrame({n: g.reset_index(drop=True) for n, g in s.groupby(level=[0, 1])})
df.stack(0).reset_index(0, drop=True).sort_index()

enter image description here

设置

import pandas as pd
from io import StringIO

txt = """Name Parameter   Value    
sdf  33             99
sdf  33             99
sdf  33             99
sdf  33            645
sdf  33            345
sdf  77            567
sdf  77             45
sdf  77            456
sdf  77            456
sdf  77            234
sdf  77            576
sdf  77             45
ere  33             99
ere  33             99
ere  33             99
ere  33            645
ere  33            345
ere  77            567
ere  77             45
ere  77            456
ere  77            456
ere  77            234
ere  77            576
ere  77             45"""

s = pd.read_csv(StringIO(txt), delim_whitespace=True, index_col=[0, 1], squeeze=True)