当前位置: 首页 > 知识库问答 >
问题:

如何在特定级别重新排序多索引数据框列

邓阳伯
2023-03-14

我有一个多索引的DataFrame,其名称附加到列级别。我希望能够轻松地对列进行无序排列,以便它们与用户指定的顺序相匹配。由于这是管道,我无法使用此推荐的解决方案,并在创建时正确订购它们。

我有一个数据表,看起来像

Experiment           BASE           IWWGCW         IWWGDW
Lead Time                24     48      24     48      24     48
2010-11-27 12:00:00   0.997  0.991   0.998  0.990   0.998  0.990
2010-11-28 12:00:00   0.998  0.987   0.997  0.990   0.997  0.990
2010-11-29 12:00:00   0.997  0.992   0.997  0.992   0.997  0.992
2010-11-30 12:00:00   0.997  0.987   0.997  0.987   0.997  0.987
2010-12-01 12:00:00   0.996  0.986   0.996  0.986   0.996  0.986

我想采取这样的列表['IWWGCW','IWWGDW','BASE']并重新排序:

Experiment           IWWGCW         IWWGDW         BASE           
Lead Time                24     48      24     48      24     48  
2010-11-27 12:00:00   0.998  0.990   0.998  0.990   0.997  0.991  
2010-11-28 12:00:00   0.997  0.990   0.997  0.990   0.998  0.987  
2010-11-29 12:00:00   0.997  0.992   0.997  0.992   0.997  0.992  
2010-11-30 12:00:00   0.997  0.987   0.997  0.987   0.997  0.987  
2010-12-01 12:00:00   0.996  0.986   0.996  0.986   0.996  0.986  

附带一个警告,我并不总是知道“实验”会是什么水平。我试过(其中df是上图的多索引框架)

df2 = df.reindex_axis(['IWWGCW', 'IWWGDW', 'BASE'], axis=1, level='Experiment')

但是这似乎不起作用——它成功地完成了,但是返回的数据帧的列顺序没有改变。

我的解决方法是具有如下功能

def reorder_columns(frame, column_name, new_order):
    """Shuffle the specified columns of the frame to match new_order."""

    index_level  = frame.columns.names.index(column_name)
    new_position = lambda t: new_order.index(t[index_level])
    new_index    = sorted(frame.columns, key=new_position)
    new_frame    = frame.reindex_axis(new_index, axis=1)
    return new_frame

其中,reorder_列(df,'Experiment',['iwgcw','iwgdw','BASE'])做了我期望的事情,但感觉我在做额外的工作。有没有更简单的方法?

共有3个答案

双恩
2023-03-14

我不知道有什么现成的。创建了一个关于它的增强票据:

http://github.com/pydata/pandas/issues/1864

通奕
2023-03-14

这是对我最简单的一个:

>

  • 对于所选级别,按所需顺序创建列列表;

    重新为列编制索引并从该列表创建一个多索引对象,记住这将返回一个元组;

    使用多索引对象对数据帧重新排序。

    cols = ['IWWGCW', 'IWWGDW', 'BASE']
    new_cols = df.columns.reindex(cols, level=0)
    df.reindex(columns=new_cols[0]) #new_cols is a single item tuple
    

    在一行中:

    df.reindex(columns=df.columns.reindex(['IWWGCW', 'IWWGDW', 'BASE'], level=0)[0])
    

  • 司徒耀
    2023-03-14

    有一个非常简单的方法:只需根据原始数据框创建一个新的数据框,多索引列的顺序正确:

    multi_tuples = [('IWWGCW',24), ('IWWGCW',48), ('IWWGDW',24), ('IWWGDW',48)
        , ('BASE',24), ('BASE',48)]
    
    multi_cols = pd.MultiIndex.from_tuples(multi_tuples, names=['Experiment', 'Lead Time'])
    
    df_ordered_multi_cols = pd.DataFrame(df_ori, columns=multi_cols)
    
     类似资料:
    • 问题内容: 从这里开始。该解决方案仅适用于一列。如何改进多列解决方案。即如果我有一个像 如何重塑像 如果df是 然后 问题答案: 采用 要么, 另外,索引不相等

    • 问题内容: 我有一个看起来像这样的数据框: 它是使用以下代码创建的: 我要做的是根据预定义的列表对行(带有索引)进行排序。结果是: 我该如何实现? 问题答案: 你可以使用预定义的顺序设置指标像 但是,如果按字母顺序排列,则可以使用 如下所示,您需要将其分配给一些变量

    • 问题内容: 我有一个数据框,具有以下的multiindex列: 如何将列索引级别展平/合并为:“ Level1 | Level2”,例如,。等等?如果这不可能,是否有办法像我上面所做的那样不创建多索引列? 问题答案: 您可以随时更改列:

    • 在python中是否可以按给定的索引重新排序列表? 如果我有列表: 我想按第二个索引重新排序,使其具有如下内容:

    • 问题内容: 我有一个带有两列“标识符”,“值”和“子标识”的以下数据框 df : 我有一个索引列表,例如 我想在列表x中提到的索引之前插入行。就像,对于在索引2之前插入的行,将具有以下值,它将具有 与 在索引2处的行 相同的标识符 ,即1; 与 索引2的行 相同的值 ,即103;但是新行中的 subid 将是((索引2处的subid)-1),或者仅仅是前一行的subid,即1。 以下是我期望的最终

    • 它在错误下面抛出: 提示我,如何删除ElasticSearch中特定类型索引中的多个或所有文档。