簡體   English   中英

在行而不是列中使用 TimeSeries 重塑 Pandas DataFrame

[英]Reshape Pandas DataFrame with TimeSeries in rows instead of columns

我有一個 DataFrame df ,其中包含 2010 年 1 月至 2021 年 12 月期間每一天的價格數據(開盤價、收盤價、最高價、最低價):

名稱 ISIN 數據 02.01.2010 05.01.2010 06.01.2010 ... 2021 年 12 月 31 日
蘋果 US9835635986 開盤價 12.45 13.45 12.48 ... 54.12
蘋果 US9835635986 收盤價 12.58 15.35 12.38 ... 54.43
蘋果 US9835635986 價格高 12.78 15.85 12.83 ... 54.91
蘋果 US9835635986 價格低 12月18日 13.35 12.21 ... 53.98
微軟 US1223928384 開盤價 12.45 13.45 12.48 ... 43.56
... .. ... ... ... ... ... ...

我正在嘗試將表格重塑為以下格式:

日期 名稱 ISIN 開盤價 收盤價 價格高 價格低
02.01.2010 蘋果 US9835635986 12.45 12.58 12.78 12月18日
05.01.2010 蘋果 US9835635986 13.45 15.35 15.85 13.35
... ... ... ... ... ... ... ...
02.01.2010 微軟 US1223928384 12.45 13.67 13.74 12.35

簡單地轉置 DateFrame 是行不通的。 我還嘗試了 pivot,它給出了操作數不能廣播到不同形狀的錯誤消息。

dates = ['NAME','ISIN']
dates.append(df.columns.tolist()[3:]) # appends all columns names starting with 02.01.2010
df.pivot(index = dates, columns = 'Data', Values = 'Data')

如何獲得所需格式的 DataFrame?

在轉換日期時間之前使用DataFrame.melt ,最后排序MultiIndex

df = (df.melt(['Name','ISIN','Data'], var_name='Date')
        .assign(Date = lambda x: pd.to_datetime(x['Date'], format='%d.%m.%Y'))
        .pivot(index = ['Date','Name','ISIN'], columns = 'Data', values = 'value')
        .sort_index(level=[1,2,0])
        .reset_index()
        )
print (df)
Data       Date       Name          ISIN  Price Close  Price High  Price Low  \
0    2010-01-02      Apple  US9835635986        12.58       12.78      12.18   
1    2010-01-05      Apple  US9835635986        15.35       15.85      13.35   
2    2010-01-06      Apple  US9835635986        12.38       12.83      12.21   
3    2021-12-31      Apple  US9835635986        54.43       54.91      53.98   
4    2010-01-02  Microsoft  US1223928384          NaN         NaN        NaN   
5    2010-01-05  Microsoft  US1223928384          NaN         NaN        NaN   
6    2010-01-06  Microsoft  US1223928384          NaN         NaN        NaN   
7    2021-12-31  Microsoft  US1223928384          NaN         NaN        NaN   

Data  Price Open  
0          12.45  
1          13.45  
2          12.48  
3          54.12  
4          12.45  
5          13.45  
6          12.48  
7          43.56  

另一個想法是首先將列名稱轉換為日期時間,然后通過DataFrame.stackSeries.unstack進行整形:

L = df.columns.tolist()
df = (df.set_axis(L[:3] + pd.to_datetime(L[3:], format='%d.%m.%Y').tolist(), axis=1)
         .rename_axis('Date', axis=1)
         .set_index(L[:3])
         .stack()
         .unstack(2)
         .reorder_levels([2,0,1])
         .reset_index())
print (df)
Data       Date       Name          ISIN  Price Close  Price High  Price Low  \
0    2010-01-02      Apple  US9835635986        12.58       12.78      12.18   
1    2010-01-05      Apple  US9835635986        15.35       15.85      13.35   
2    2010-01-06      Apple  US9835635986        12.38       12.83      12.21   
3    2021-12-31      Apple  US9835635986        54.43       54.91      53.98   
4    2010-01-02  Microsoft  US1223928384          NaN         NaN        NaN   
5    2010-01-05  Microsoft  US1223928384          NaN         NaN        NaN   
6    2010-01-06  Microsoft  US1223928384          NaN         NaN        NaN   
7    2021-12-31  Microsoft  US1223928384          NaN         NaN        NaN   

Data  Price Open  
0          12.45  
1          13.45  
2          12.48  
3          54.12  
4          12.45  
5          13.45  
6          12.48  
7          43.56  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM