3 回答

TA貢獻1982條經(jīng)驗 獲得超2個贊
一種選擇是melt,set_index和unstack:
u = df.melt(['ticker', 'source', 'timestamp'])
(u.set_index(u.columns.difference({'value'}).tolist())['value']
.unstack([1, 0, -1])
.sort_index(axis=1))
ticker A B
source LSE LSE
variable PX_CLOSE PX_LAST PX_OPEN PX_CLOSE PX_LAST PX_OPEN
timestamp
20180101 3 1 2 9 7 8
20180102 6 4 5 12 10 11
或melt, 和pivot_table:
u = df.melt(['ticker', 'source', 'timestamp'])
u.pivot_table(index='timestamp',
columns=['ticker','source','variable'],
values='value')
ticker A B
source LSE LSE
variable PX_CLOSE PX_LAST PX_OPEN PX_CLOSE PX_LAST PX_OPEN
timestamp
20180101 3 1 2 9 7 8
20180102 6 4 5 12 10 11

TA貢獻1843條經(jīng)驗 獲得超7個贊
您的解決方案應(yīng)該稍作更改 - 中的列順序set_index,省略第二個swaplevel并添加sort_index:
df = (df.set_index(['timestamp', 'source', 'ticker'])
.unstack(level=[1,2])
.swaplevel(0,2,axis=1)
.sort_index(axis=1)
)
print (df)
ticker A B
source LSE LSE
PX_CLOSE PX_LAST PX_OPEN PX_CLOSE PX_LAST PX_OPEN
timestamp
20180101 3 1 2 9 7 8
20180102 6 4 5 12 10 11

TA貢獻1821條經(jīng)驗 獲得超5個贊
我的提議是通過以下方式更改您的解決方案:
第 1 步:df.set_index(['timestamp', 'ticker', 'source']).unstack([1, 2]),就像您所做的那樣。
它將列保留為以下形狀:
PX_LAST PX_OPEN PX_CLOSE
ticker A B A B A B
source LSE LSE LSE LSE LSE LSE
(并timestamp作為索引)。
第 2 步:reorder_levels([1, 2, 0], axis=1),而不是您的 2 條 swaplevel說明。
它將列保留為:
ticker A B A B A B
source LSE LSE LSE LSE LSE LSE
PX_LAST PX_LAST PX_OPEN PX_OPEN PX_CLOSE PX_CLOSE
最后一步是 sort_index(axis=1, level=[0,1], sort_remaining=False)
請注意,您只對級別 0 和 1 進行排序,因此最后級別的順序保持不變(PX_LAST、PX_OPEN、PX_CLOSE)。
所以整個腳本(即一條指令)是:
df2 = df.set_index(['timestamp', 'ticker', 'source']).unstack([1, 2])\
.reorder_levels([1, 2, 0], axis=1)\
.sort_index(axis=1, level=[0,1], sort_remaining=False)
當(dāng)你打印結(jié)果時,你會得到:
ticker A B
source LSE LSE
PX_LAST PX_OPEN PX_CLOSE PX_LAST PX_OPEN PX_CLOSE
timestamp
20180101 1 2 3 7 8 9
20180102 4 5 6 10 11 12
添加回答
舉報