将列分配给更高层次的多索引级别

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

   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
   A      B
   x   y  x   y
0  1  20  2  20
1  3  21  5  22
2  4  20  7  25

所以我正在寻找的是一个声明,它说:

Ax 和 Ay 在 A 下作为 x 和 y

回答

通过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


回答

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

  • MultiIndex.from_arrays
    将数组列表转换为 MultiIndex。

  • MultiIndex.from_product
    从迭代的笛卡尔积创建一个 MultiIndex。

  • MultiIndex.from_tuples
    将元组列表转换为 MultiIndex。

  • MultiIndex.from_frame
    从 DataFrame 创建 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


以上是将列分配给更高层次的多索引级别的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>