Amount dwy bmd
Portfolio EUR GBP JPY USD EUR GBP JPY USD EUR GBP JPY USD
date
2016-05-13 100 200 300 400 -0.5 0.5 0 0.8 3.8 3 0 3
我想把它转移到这个:
date ccy amt dwy bmd
2016-05-13 EUR 100 -0.5 3.8
2016-05-13 GBP 200 0.5 3
2016-05-13 JPY 300 0 0
2016-05-13 USD 400 0.8 3
我已经尝试过各种方式的df.stack()和df.unstack以及df.T.除了把它拆开并重新组装之外还有更优化的方法吗?
解决方法:
pd.DataFrame(df.stack(“Currency”).to_records())应该做的伎俩.
以下是对步骤的解释:
1.重现您的数据框:
arrays = [['Amount', 'Amount', 'Amount', 'Amount', 'dwy', 'dwy', 'dwy', 'dwy', 'bmd', 'bmd', 'bmd', 'bmd'],
['EUR', 'GBP', 'JPY', 'USD', 'EUR', 'GBP', 'JPY', 'USD', 'EUR', 'GBP', 'JPY', 'USD']]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['Portfolio', 'Currency'])
data = [100, 200, 300, 400, -0.5, 0.5, 0, 0.8, 3.8, 3, 0, 3]
df = pd.DataFrame(data).T
df.columns = index
df.index = ['2016-05-13']
这是“输入”DataFrame:
Portfolio Amount dwy bmd
Currency EUR GBP JPY USD EUR GBP JPY USD EUR GBP JPY USD
2016-05-13 100 200 300 400 -0.5 0.5 0 0.8 3.8 3 0 3
2.调用df.stack(“Currency”)将堆叠在Currency列上:
Portfolio Amount bmd dwy
Currency
2016-05-13 EUR 100 3.8 -0.5
GBP 200 3.0 0.5
JPY 300 0.0 0.0
USD 400 3.0 0.8
3.关闭但不完全.我们只需要展平Dataframe的索引.为此,我们可以调用to_records():
3. df.stack("Currency").to_records()
# Result:
# => rec.array([('2016-05-13', 'EUR', 100.0, 3.8, -0.5),
('2016-05-13', 'GBP', 200.0, 3.0, 0.5),
('2016-05-13', 'JPY', 300.0, 0.0, 0.0),
('2016-05-13', 'USD', 400.0, 3.0, 0.8)],
dtype=[('level_0', 'S10'), ('Currency', 'S3'), ('Amount', '<f8'), ('bmd', '<f8'), ('dwy', '<f8')])
4.然后我们可以使用新索引重新创建数据框:
pd.DataFrame(df.stack("Currency").to_records())
level_0 Currency Amount bmd dwy
0 2016-05-13 EUR 100 3.8 -0.5
1 2016-05-13 GBP 200 3.0 0.5
2 2016-05-13 JPY 300 0.0 0.0
3 2016-05-13 USD 400 3.0 0.8
从这里,您可以根据需要简单地重命名和重新排序列.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。