[英]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.stack
和Series.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.