使用二级索引值将 Pandas 中的列转换为行

Meh*_*are 4 python python-3.x pandas

这里跟进我之前的问题:

import pandas as pd
d = pd.DataFrame({'value':['a', 'b'],'2019Q1':[1, 5], '2019Q2':[2, 6], '2019Q3':[3, 7]})

Run Code Online (Sandbox Code Playgroud)

显示如下:

   value    2019Q1  2019Q2  2019Q3
0  a        1       2       3
1  b        5       6       7
Run Code Online (Sandbox Code Playgroud)

我怎样才能把它变成这个形状:

Year    measure    Quarter    Value
2019    a          1          1
2019    a          2          2
2019    a          3          3
2019    b          1          5
2019    b          2          6
2019    b          3          7
Run Code Online (Sandbox Code Playgroud)

ans*_*sev 5

使用pd.wide_to_longDataFrame.melt

df2 = df.copy()
df2.columns = df.columns.str.split('Q').str[::-1].str.join('_')

new_df = (pd.wide_to_long(df2.rename(columns = {'value':'Measure'}),
                          ['1','2','3'],
                          j="Year",
                          i = 'Measure',
                          sep='_')
            .reset_index()
            .melt(['Measure','Year'],var_name = 'Quarter',value_name = 'Value')
            .loc[:,['Year','Measure','Quarter','Value']]
            .sort_values(['Year','Measure','Quarter']))

print(new_df)
   Year Measure Quarter  Value
0  2019       a       1      1
2  2019       a       2      2
4  2019       a       3      3
1  2019       b       1      5
3  2019       b       2      6
5  2019       b       3      7
Run Code Online (Sandbox Code Playgroud)