重新塑造数据框,使列标题变成行

问题描述 投票:0回答:3

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

          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")
python pandas pivot
3个回答
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
投票
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]

0
投票
df1.set_index("Tenor").stack().reset_index().add_prefix("col_").sql().select("strptime(col_level_1,'%YM%mD%d')::date Date,col_Tenor Tenor,col_0 Rate").to_df()

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
© www.soinside.com 2019 - 2024. All rights reserved.