使用熊猫的宽到长MiltiIndex数据集

时间:2019-07-02 03:20:27

标签: python pandas multi-index

我已经解决了部分问题Wide to long dataset using pandas,但仍需要更多帮助。

我有一个数据集,其列为: IA01_Raw_BaselineIA01_Raw_MidlineIA01_Class1_Endline等。我想将其破坏,以使中间单词(即Raw,Class1等)保留在列中,并且IA x ,< em> time 线(中,底,末)变成两列。例如,一行数据:

ID   Country Type Region Gender IA01_Raw_EndLine  IA01_Raw_Baseline  IA01_Raw_Midline IA02_Raw QA_Include QA_Comments

SC1  France  A    Europe Male   4                 8                  1                         yes       N/A

它应该变成:

ID   Country Type Region Gender Timeline IA   Raw Class1 Class2 QA_Include QA_Comments

SC1  France  A    Europe Male   Endline  IA01 4    N/A      N/A yes        N/A
SC1  France  A    Europe Male   Baseline IA01 8    N/A      N/A yes        N/A    
SC1  France  A    Europe Male   Midline  IA01 1    N/A      N/A yes        N/A

这只是一行的转换,我有500多个列,其中 IA 01 12 具有不同的属性,例如原始 Class1 Class2 金额等都具有基准中线

在进行转换时,我确实将它们分解为列,其中idVars包含将作为索引的列,而valueVars将具有IA01_Raw_Baseline类型的列:

idVars = list(gd_df.columns[0:40]) + list(gd_df.columns[472:527]) #values that will not pivot
valueVars = gd_df.columns[41:472]#.tolist() #value that will pivot

gd_df2 = gd_df.set_index(idVars)
gd_df2.columns = pd.MultiIndex.from_tuples(map(tuple, gd_df2.columns.str.split('_', n=1)))
gd_out =  gd_df2.stack(level=0).reset_index().rename({'level_7': 'IA'}, axis=1)

所以这段代码给了我:

enter image description here

如您所见,我以自己想要的方式获得了IA列,但时间轴仍嵌入在列名中。 我应该在代码中进行哪些更改,以便它提供此输出

enter image description here

更新: 通过这样做:

s=df.set_index(idVars)
s.columns=pd.MultiIndex.from_tuples(s.columns.str.split('_').map(tuple),names =['IA','raw','Timeline'])
s.stack([0,2]).reset_index()
s.to_excel(r'gd_out1.xlsx')

我得到: enter image description here

1 个答案:

答案 0 :(得分:1)

自从您提到从宽到长以来,我们使用wide_to_long

s=pd.wide_to_long(df,['IA01_Raw'],i=['ID', 'Country', 'Type', 'Region', 'Gender','IA02_Raw', 'QA_Include',
       'QA_Comments'],j='Timeline',suffix='\w+',sep='_')
s.columns=pd.MultiIndex.from_tuples(s.columns.str.split('_').map(tuple),names =['IA','raw'])
s.stack(0).reset_index()
Out[27]: 
raw   ID Country Type  Region ...  QA_Comments  Timeline    IA  Raw
0    SC1  France    A  Europe ...          NaN   EndLine  IA01    4
1    SC1  France    A  Europe ...          NaN  Baseline  IA01    8
2    SC1  France    A  Europe ...          NaN   Midline  IA01    1
[3 rows x 11 columns]

更新

s=df.set_index(['ID', 'Country', 'Type', 'Region', 'Gender', 'QA_Include',
       'QA_Comments','IA02_Raw'])
s.columns=pd.MultiIndex.from_tuples(s.columns.str.split('_').map(tuple),names =['IA','raw','Timeline'])
s.stack([0,2]).reset_index()