Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有多索引列的数据帧-将列从级别0移动到级别1(不交换或重新排序)_Python_Pandas_Dataframe - Fatal编程技术网

Python 具有多索引列的数据帧-将列从级别0移动到级别1(不交换或重新排序)

Python 具有多索引列的数据帧-将列从级别0移动到级别1(不交换或重新排序),python,pandas,dataframe,Python,Pandas,Dataframe,我在Pandas文档中找不到这一点,但是如何将包含多索引列的Pandas数据帧中的某些列从级别0移动到级别1?我不想交换它们或对它们重新排序,我只想将所选列从级别0移动到级别1,以便这些列最终在级别1中复制。所以我最初使用的数据帧是这样的 A B C X Y Z X1 X2 Y1

我在Pandas文档中找不到这一点,但是如何将包含多索引列的Pandas数据帧中的某些列从级别0移动到级别1?我不想交换它们或对它们重新排序,我只想将所选列从级别0移动到级别1,以便这些列最终在级别1中复制。所以我最初使用的数据帧是这样的

A      B     C     X                                    Y           Z
                   X1               X2                  Y1          Z1
a      b     c     x1               x2                  y1          z1
..     ..    ..    ..               ..                  ..          ..
X                         Y                     Z
X1    X2    A    B    C   Y1    A    B    C     Z1    A    B    C
x1    x2    a    b    c   y1    a    b    c     z1    a    b    c
..    ..    ..   ..   ..  ..    ..   ..   ..    ..    ..   ..   ..
我想移动列
A
B
C
,在
X
Y
Z
之间进行复制,以产生类似的结果

A      B     C     X                                    Y           Z
                   X1               X2                  Y1          Z1
a      b     c     x1               x2                  y1          z1
..     ..    ..    ..               ..                  ..          ..
X                         Y                     Z
X1    X2    A    B    C   Y1    A    B    C     Z1    A    B    C
x1    x2    a    b    c   y1    a    b    c     z1    a    b    c
..    ..    ..   ..   ..  ..    ..   ..   ..    ..    ..   ..   ..
我试图用一种简单的方法来实现这一点,方法是在
X
Y
Z
上循环,并将
a
B
C
列分配给每一列,但这对我不起作用。因此,下面的方法不起作用

    for level in ['X', 'Y', 'Z']:
        df[level] = df[level].assign(A=df['A'], B=df['B'], C=df['C']
要复制上面的原始示例数据帧,请使用以下代码

import pandas as pd

data = [['a', 'b', 'c', 'x1', 'x2', 'y1', 'z1']]

columns = pd.MultiIndex.from_tuples(
    [
        ('A',''),
        ('B', ''),
        ('C', ''),
        ('X', 'X1'), ('X', 'X2'),
        ('Y', 'Y1'),
        ('Z', 'Z1')
    ]
)

df = pd.DataFrame(data=data, columns=columns)
因此,输入数据帧(为了简单起见只有一个数据行)如下所示

>>> df
   A  B  C   X       Y   Z
            X1  X2  Y1  Z1
0  a  b  c  x1  x2  y1  z1

您可以这样做:

move = ['A', 'B', 'C']
keep = ['X', 'Y', 'Z']
for item in keep:
    for key in move:
        df[(item, key)] = df[key]
df = df.drop(move, axis=1)
df
这将导致:

如果在打印数据框之前再添加一行,则会得到所需的结果:

df.sort_index(1, level=0, inplace=True)
df

请提供一份样本数据。由于您的数据具有多索引,最好提供复制/生成数据的代码。我无法共享数据。从示例中的模式中应该可以清楚地看到尝试了什么—将列从一个级别移动到另一个级别。实际的数据并不重要,它可以是任何东西,字符串,数字等等。我不是要求你分享你的数据。我要求您提供生成模拟数据的代码。请参阅。我已在上面添加了示例数据框创建代码。好的,看起来这会在每个部分的末尾追加
A
B
C
,但我正在寻找一种更内置的方法。行排序与列排序不匹配。