我有以下数据:

from pandas import Timestamp

values = [['IDX100', 'field1', Timestamp('1999-02-01 05:00:00'), '101'],
       ['IDX100', 'field1', Timestamp('1999-02-02 05:00:00'), '102'],
       ['IDX100', 'field1', Timestamp('1999-02-03 05:00:00'), '103'],
       ['IDX200', 'field1', Timestamp('1999-02-01 05:00:00'), '601'],
       ['IDX200', 'field1', Timestamp('1999-02-02 05:00:00'), '602'],
       ['IDX200', 'field1', Timestamp('1999-02-03 05:00:00'), '603'],
       ['IDX100', 'field2', Timestamp('1999-02-01 05:00:00'), '201'],
       ['IDX100', 'field2', Timestamp('1999-02-02 05:00:00'), '202'],
       ['IDX100', 'field2', Timestamp('1999-02-03 05:00:00'), '203'],
       ['IDX200', 'field2', Timestamp('1999-02-01 05:00:00'), '701'],
       ['IDX200', 'field2', Timestamp('1999-02-02 05:00:00'), '702'],
       ['IDX200', 'field2', Timestamp('1999-02-03 05:00:00'), '703'],
       ['IDX100', 'field3', Timestamp('1999-02-01 05:00:00'), '301'],
       ['IDX100', 'field3', Timestamp('1999-02-02 05:00:00'), '302'],
       ['IDX100', 'field3', Timestamp('1999-02-03 05:00:00'), '303'],
       ['IDX200', 'field3', Timestamp('1999-02-01 05:00:00'), '801'],
       ['IDX200', 'field3', Timestamp('1999-02-02 05:00:00'), '802'],
       ['IDX200', 'field3', Timestamp('1999-02-03 05:00:00'), '803']]

df = pd.DataFrame(values, columns = ['identifier', 'code', 'date', 'value'])

在旋转我的框架后,我结束了以下:

df = df.pivot(index=['date'], columns=['identifier', 'code'], values=['value'])

                     value                                   
identifier          IDX100 IDX200 IDX100 IDX200 IDX100 IDX200
code                field1 field1 field2 field2 field3 field3
date                                                         
1999-02-01 05:00:00    101    601    201    701    301    801
1999-02-02 05:00:00    102    602    202    702    302    802
1999-02-03 05:00:00    103    603    203    703    303    803

但是,我希望输出看起来像这样:

identifier           IDX100                IDX200 
code                 field3 field2 field1  field3 field2 field1
date                                                         
1999-02-01 05:00:00    301    201    101   801    701    601
1999-02-02 05:00:00    302    202    102   802    702    602
1999-02-03 05:00:00    303    203    103   803    703    603

我可以通过这样做来接近这一点:

df = df.reindex(sorted(df.columns), axis=1)

但这将保持level 2列的顺序为field1、field2、field3.我想要的是能够以不同的方式排序这个级别.最好是根据我提供的名单来确定. 例如,我可能希望将其排序为field 3,field 2,field 1,或field 2,field 1,field 3.

有人能帮我吗?

推荐答案

Example Code

特别是如果rame包含一个多索引,需要代码,可以创建rame,以重现你的rame.

这次我给你提供密码.

import pandas as pd

data = [[101, 601, 201, 701, 301, 801], [102, 602, 202, 702, 302, 802], [103, 603, 203, 703, 303, 803]]

idx = pd.Index(['1999-02-01 05:00:00', '1999-02-02 05:00:00', '1999-02-03 05:00:00'], name='date')
cols = pd.MultiIndex.from_product([['field1', 'field2', 'field3'], ['IDX100', 'IDX200']], names=['code', 'identifier']).swaplevel(0, 1)
DF = pd.DataFrame(data, index=idx, columns=cols)

DF

enter image description here


Code

让我们排序field2—field1—field3>>

使用sort_index

order = ['field2', 'field1', 'field3']
m = {key: num for num, key in enumerate(order)}
out = DF.sort_index(axis=1, key=lambda x: x.map(m) if x.name == 'code' else x)

输出:

enter image description here

Python相关问答推荐

更改matplotlib彩色条的字体并勾选标签?

Django管理面板显示字段最大长度而不是字段名称

Odoo 14 hr. emergency.public内的二进制字段

试图找到Python方法来部分填充numpy数组

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

在Python Attrs包中,如何在field_Transformer函数中添加字段?

将输入管道传输到正在运行的Python脚本中

在Python中动态计算范围

在ubuntu上安装dlib时出错

未调用自定义JSON编码器

当单元测试失败时,是否有一个惯例会抛出许多类似的错误消息?

如何在GEKKO中使用复共轭物

使用嵌套对象字段的Qdrant过滤

你能把函数的返回类型用作其他地方的类型吗?'

TypeError:';Locator';对象无法在PlayWriter中使用.first()调用

随机森林n_估计器的计算

如何在Pandas中用迭代器求一个序列的平均值?

如何在Polars中创建条件增量列?

try 在单个WITH_COLUMNS_SEQ操作中链接表达式时,使用Polars数据帧时出现ComputeError

如何计算Pandas 中具有特定条件的行之间的天差