【问题标题】:Pandas dataframe with multi-index columns - move columns from level 0 to level 1 (NOT swap or re-order)具有多索引列的 Pandas 数据框 - 将列从 0 级移动到 1 级(不交换或重新排序)
【发布时间】:2020-11-05 16:06:28
【问题描述】:

我在 Pandas 文档或 SO 中找不到此内容,但是如何将具有多索引列的 Pandas 数据框中的某些列从级别 0 移动到级别 1?我不想交换它们或重新排序它们,我只想将选定的列从级别 0 移动到级别 1,以便这些列最终在级别 1 中复制。所以我最初的数据框看起来像这样

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

我想移动列 ABC 以跨级别复制 XYZ 以生成类似的内容

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
..    ..    ..   ..   ..  ..    ..   ..   ..    ..    ..   ..   ..

我尝试通过循环 XYZ 并为每个列分配 ABC 以简单的方式做到这一点,但这不适用于我。所以下面这行不通。

    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

【问题讨论】:

  • 请提供样本数据。由于您的数据具有多索引,因此最好提供复制/生成数据的代码。
  • 我无法共享数据。从示例中的模式应该清楚正在尝试什么 - 将列从一个级别移动到另一个级别。实际数据无关紧要,可以是任何东西、字符串、数字等。
  • 我不是要你分享你的数据。我要求您提供生成模拟数据的代码。
  • 请参考this question
  • 我在上面添加了示例数据框创建代码。

标签: python pandas dataframe


【解决方案1】:

你可以这样做:

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

【讨论】:

  • 好的,看起来像这样在每个部分的末尾附加了ABC,但我正在寻找一种更内置的方法。
  • 行排序与列排序不匹配。
猜你喜欢
  • 2020-12-17
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2012-06-27
  • 2015-04-06
  • 2019-11-17
相关资源
最近更新 更多