将 pandas 数据帧旋转为具有多层的长格式

Posted

技术标签:

【中文标题】将 pandas 数据帧旋转为具有多层的长格式【英文标题】:Pivot pandas dataframe to long format with multiple layers 【发布时间】:2020-11-15 03:17:30 【问题描述】:
|            |          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   | 


如何将上面的具有多层的数据框转换为如下所示的长格式? 预期输出如下所示:

|            | 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]

【问题讨论】:

您是从数据透视表开始的吗? 数据框自带多层。 df.stack() ??我没有正确回答这个问题。你的输入和预期输出对我来说并不完全清楚。 为什么输出中只有三个元素(行)? 对不起,只是为了表达想法,应该更是的 【参考方案1】:

让我们重现第一个数据帧。

答:

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

乙:

            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

【讨论】:

以上是关于将 pandas 数据帧旋转为具有多层的长格式的主要内容,如果未能解决你的问题,请参考以下文章

JSON多层嵌套复杂结构数据扁平化处理转为行列数据

python使用pandas将mysql数据表转为excel表格

Java将json中key值下划线转为驼峰格式

Python读取excel中的一(多)列并转为数组

ArcGIS风暴如何将矢量数据(点线面)折点坐标转为GeoJSON格式?

ArcGIS风暴如何将矢量数据(点线面)折点坐标转为GeoJSON格式?