【问题标题】:Assigning columns to a hierarchical higher Multiindex level将列分配给层次更高的多索引级别
【发布时间】:2021-08-20 20:36:37
【问题描述】:

我有一个看起来像这样的数据框:

   Ax  Ay  Bx  By
0   1  20   2  20
1   3  21   5  22
2   4  20   7  25

我想手动定义 Ax 和 Ay 具有 A 的层次更高的 MultiIndex 级别(并且对 B 也执行相同的操作)。使数据框看起来像这样:

   A      B
   x   y  x   y
0  1  20  2  20
1  3  21  5  22
2  4  20  7  25

所以我正在寻找的是这样的声明:

Ax 和 Ay 作为 x 和 y 在 A 之下

【问题讨论】:

  • 在您的列中如何区分 A 和 x?它是字面上的第一个和第二个字符,还是更复杂的?
  • 实际上不是第一个字符

标签: python pandas dataframe multi-index


【解决方案1】:

通过split()droplevel()

df.columns=df.columns.str.split('([A-Z])',expand=True).droplevel(0)

通过pd.MultiIndex.from_arrays():

df.columns=pd.MultiIndex.from_arrays([['A','A','B','B'],['x','y','x','y']])

df的输出:

   A      B
   x   y  x   y
0  1  20  2  20
1  3  21  5  22
2  4  20  7  25

【讨论】:

    【解决方案2】:

    让我们使用正则表达式和splitexpand=True 参数:

    df.columns = df.columns.str.split('(?<=[A-Z])', expand=True)
    

    输出:

       A      B    
       x   y  x   y
    0  1  20  2  20
    1  3  21  5  22
    2  4  20  7  25
    

    【讨论】:

      【解决方案3】:

      您可以使用多个构造函数之一手动构造pandas.MultiIndex。来自文档:

      所有这些都很有用,我会逐一检查以了解它们的用例。对于您的情况,我认为pd.MultiIndex.from_tuples 可能会成功:

      In [4]: list_of_split_tuples = list(map(tuple, df.columns.values))
      
      In [5]: df.columns = pd.MultiIndex.from_tuples(list_of_split_tuples)
      
      In [6]: df
      Out[6]:
         A      B
         x   y  x   y
      0  1  20  2  20
      1  3  21  5  22
      2  4  20  7  25
      

      【讨论】:

        猜你喜欢
        • 2020-12-05
        • 2020-01-05
        • 2018-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-14
        • 1970-01-01
        • 2016-12-27
        相关资源
        最近更新 更多