pandas - 将数据透视表堆叠在一起
问题描述
我有一个包含以下列的数据框:
Index(u['Stock','EarnDate','Last','Settle','Change'],dtype='object')
其中 EarnDate 是反映下一次收益发布的日期。
我创建了一个数据透视表:
pivot = pd.pivot_table(df, index='EarnDate',columns='Stock'),dtype='object')
这给了我以下输出
Last Settle Chg
Stock Stock1 Stock2 Stock1 Stock2 Stock1 Stock2
EarnDate
2019-10-01 NaN 5.55 NaN 5.55 NaN +1
2019-11-01 65.91 3.43 62.91 6.55 -.5 +2
2019-12-01 62.97 6.87 61.97 7.00 +.4 +3
2020-01-01 63.33 6.66 61.38 9.50 -.3 +4
2020-02-01 60.91 5.98 60.99 8.50 +.2 +5
2020-03-01 60.71 6.23 60.70 7.50 -.15 +6
我想做的是按 Stock 对 Last、Settle、Chg 字段进行分组,使其看起来像这样:
Stock Stock1 Stock 2
Last Settle Chg Last Settle Chg
EarnDate
2019-10-01 NaN NaN NaN 5.55 5.55 +1
2019-11-01 65.91 62.91 -.5 3.43 6.55 +2
2019-12-01 62.97 61.97 +.4 6.87 7.00 +3
2020-01-01 63.33 61.38 -.3 6.66 9.50 +4
2020-02-01 60.91 60.99 +.2 5.98 8.50 +5
2020-03-01 60.71 60.70 -.15 6.23 7.50 +6
我尝试了各种 stack()/unstack() 组,但没有成功。有人可以带我回家吗?谢谢!
解决方案
DataFrame.swaplevel
与 一起使用DataFrame.reindex
:
mux = pd.MultiIndex.from_product([['Stock1', 'Stock2'], ['Last', 'Settle', 'Chg']])
df = df.swaplevel(0,1, axis=1).reindex(mux, axis=1)
print (df)
Stock1 Stock2
Last Settle Chg Last Settle Chg
2019-10-01 NaN NaN NaN 5.55 5.55 1
2019-11-01 65.91 62.91 -0.50 3.43 6.55 2
2019-12-01 62.97 61.97 0.40 6.87 7.00 3
2020-01-01 63.33 61.38 -0.30 6.66 9.50 4
2020-02-01 60.91 60.99 0.20 5.98 8.50 5
2020-03-01 60.71 60.70 -0.15 6.23 7.50 6
原因是如果使用DataFrame.sort_index
在第二级获得不同的列顺序:
df = df.swaplevel(0,1, axis=1).sort_index(axis=1, level=0)
print (df)
Stock1 Stock2
Chg Last Settle Chg Last Settle
2019-10-01 NaN NaN NaN 1 5.55 5.55
2019-11-01 -0.50 65.91 62.91 2 3.43 6.55
2019-12-01 0.40 62.97 61.97 3 6.87 7.00
2020-01-01 -0.30 63.33 61.38 4 6.66 9.50
2020-02-01 0.20 60.91 60.99 5 5.98 8.50
2020-03-01 -0.15 60.71 60.70 6 6.23 7.50
推荐阅读
- javascript - 无法在 Bootstrap 5 中使用 JavaScript 打开 Modal
- azure - Azure 函数 proxies.json 文件未生效
- magento - 为什么要在 Magento2 的每个插件拦截器中使用 $subject?
- bash - 在 httpd.conf 中更新 ServerLimit 的 Bash 方式
- c# - FileStream 损坏的 zip - SignalR Stream
- gatsby - Gatsby TypeError:createNodeId 不是函数
- java - 在 Java/Python 中识别安全/认证的 pdf 文件
- jquery - 如何在网页中将普通的 HTML Select 元素与 Material Select 并排使用?
- python - 尝试使用键绑定时出现 Tkinter/Canvas 类型错误
- python - 浮士德:TypeError:produce()得到了一个意外的关键字参数'timestamp'