使用Pandas将数据框转换为多层次的长格式

5
|            |          Var1                 Var2                 
|------------|------|------|-----|------|------|-----|
|            | SPY  | AAPL | MSFT| SPY  | AAPL | MSFT 
|       Date |      |      |     |      |      |     |         
| 2011-01-03 | 30   | 30  | 30   | 30   | 30  | 30   | 
| 2011-01-04 | 30   | 30  | 30   | 21   | 30  | 30   | 
| 2011-01-05 | 30   | 30  | 30   | 30   | 30  | 30   | 



如何将上面有多个层级的数据框架(dataframe)转换为下面的长格式(long format)?
期望输出如下:
|            | firm | Var1 | Var2 |
|------------|------|------|------|
| Date       |      |      |      |    
| 2011-01-03 | AAPL |   30 |   30 | 
| 2011-01-04 | SPY  |   30 |   30 |
| 2011-01-05 | MSFT |   30 |   30 |  

示例数据:

df = pd.DataFrame([{('Var1', 'SPY'): 30.0,
      ('Var1', 'AAPL'): 30.0,
      ('Var1', 'MSFT'): 30.0,
      ('Var2', 'SPY'): 30.0,
      ('Var2', 'AAPL'): 30.0,
      ('Var2', 'MSFT'): 30.0},
     {('Var1', 'SPY'): 30.0,
      ('Var1', 'AAPL'): 30.0,
      ('Var1', 'MSFT'): 30.0,
      ('Var2', 'SPY'): 21.0,
      ('Var2', 'AAPL'): 30.0,
      ('Var2', 'MSFT'): 30.0},
     {('Var1', 'SPY'): 30.0,
      ('Var1', 'AAPL'): 30.0,
      ('Var1', 'MSFT'): 30.0,
      ('Var2', 'SPY'): 30.0,
      ('Var2', 'AAPL'): 30.0,
      ('Var2', 'MSFT'): 30.0}]

你要开始使用数据透视表吗? - Ranika Nisal
数据框具有多层结构。 - arv
df.stack() ?? 我没有完全理解问题。您的输入和期望的输出是什么并不是很清楚。 - Pygirl
为什么输出中只有三个元素(行)? - Pygirl
抱歉,这只是为了表达想法,应该更加详细。 - arv
这就是 stack() 的用途。你试过了吗? - Pygirl
1个回答

2

let's reproduce the dataframe 1st.

A:

            SPL AAPL MSFT
2011-01-03  30  30  30
2011-01-04  30  30  30
2011-01-05  30  30  30

B:

            SPL AAPL MSFT
2011-01-03  30  30  30
2011-01-04  21  30  30
2011-01-05  30  30  30

A.columns = pd.MultiIndex.from_product([['Var1'], A.columns])
B.columns = pd.MultiIndex.from_product([['Var2'], B.columns])
df = pd.concat([A, B], axis = 1)

您当前的数据框 df:

                Var1           Var2
            SPL AAPL MSFT   SPL AAPL MSFT
2011-01-03  30  30  30      30  30  30
2011-01-04  30  30  30      21  30  30
2011-01-05  30  30  30      30  30  30

代码:

df = df.stack().reset_index().rename(columns={'level_0':'Date', 'level_1': 'firm'})
df.set_index(['Date'], inplace=True)

结果 df:

            firm    Var1    Var2
Date            
2011-01-03  AAPL    30      30
2011-01-03  MSFT    30      30
2011-01-03  SPL     30      30
2011-01-04  AAPL    30      30
2011-01-04  MSFT    30      30
2011-01-04  SPL     30      21
2011-01-05  AAPL    30      30
2011-01-05  MSFT    30      30
2011-01-05  SPL     30      30

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接