重新整形Dataframe,使列标题成为行

时间:2015-06-23 14:36:54

标签: python pandas pivot

我正在尝试重塑下面的数据框架。

          Tenor   2013M06D12   2013M06D13   2013M06D14   \
1         1           1.24         1.26         1.23   
4         2           2.01         0.43         0.45   
5         3           1.21         2.24         1.03   
8         4           0.39         2.32         1.23  

所以,它看起来如下。我正在考虑使用pivot_table,但这与我需要将列标题转换为行而不是相反的方式相反。因此,我不知道如何进行以获得此数据帧。

           Date        Tenor           Rate
1    2013-06-12           1            1.24        
2    2013-06-13           1            1.26          
4    2013-06-14           1            1.23            

代码只涉及从CSV中读取:

result = pd.DataFrame.read_csv("BankofEngland.csv")

2 个答案:

答案 0 :(得分:1)

我认为你可以使用melt,排序,日期解析和一些列改组:

dfm = pd.melt(df, id_vars="Tenor", var_name="Date", value_name="Rate")
dfm = dfm.sort("Tenor").reset_index(drop=True)
dfm["Date"] = pd.to_datetime(dfm["Date"], format="%YM%mD%d")
dfm = dfm[["Date", "Tenor", "Rate"]]

产生

In [104]: dfm
Out[104]: 
         Date  Tenor  Rate
0  2013-06-12      1  1.24
1  2013-06-13      1  1.26
2  2013-06-14      1  1.23
3  2013-06-12      2  2.01
4  2013-06-13      2  0.43
5  2013-06-14      2  0.45
6  2013-06-12      3  1.21
7  2013-06-13      3  2.24
8  2013-06-14      3  1.03
9  2013-06-12      4  0.39
10 2013-06-13      4  2.32
11 2013-06-14      4  1.23

答案 1 :(得分:1)

import pandas as pd
import numpy as np


# try to read your sample data, replace with your read_csv func
df = pd.read_clipboard()

Out[139]: 
   Tenor  2013M06D12  2013M06D13  2013M06D14
1      1        1.24        1.26        1.23
4      2        2.01        0.43        0.45
5      3        1.21        2.24        1.03
8      4        0.39        2.32        1.23


# reshaping
df.set_index('Tenor', inplace=True)
df = df.stack().reset_index()
df.columns=['Tenor', 'Date', 'Rate']
# suggested by DSM, use the date parser
df.Date = pd.to_datetime(df.Date, format='%YM%mD%d')

Out[147]: 
    Tenor       Date  Rate
0       1 2013-06-12  1.24
1       1 2013-06-13  1.26
2       1 2013-06-14  1.23
3       2 2013-06-12  2.01
4       2 2013-06-13  0.43
..    ...        ...   ...
7       3 2013-06-13  2.24
8       3 2013-06-14  1.03
9       4 2013-06-12  0.39
10      4 2013-06-13  2.32
11      4 2013-06-14  1.23

[12 rows x 3 columns]