微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 如何使用Pandas重新排列DataFrame?

我有一个DataFrame:

                 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] 举报,一经查实,本站将立刻删除。

相关推荐