【问题标题】:Adding a another level of columns for a pandas data frame为熊猫数据框添加另一层列
【发布时间】:2022-11-18 10:55:28
【问题描述】:

我有一个包含 60 列的数据框;为了说明起见,我将展示一个示例数据框,它看起来像我拥有的​​但要短得多。示例数据框如下所示:

       0         1     ...     0         1     ...
0 -0.611064 -0.032586  ... -0.102049  1.582183 ...

我想要的是在现有列的顶部添加另一层列,这样它就变成了这样:

           A                       B
      0         1     ...     0         1      ... 
0 -0.611064 -0.032586 ...  -0.102049  1.582183 ... 

我尝试了以下方法:

df.columns = pd.MultiIndex.from_product([['A','B'], df.columns])

但我收到一条错误消息

ValueError: Length mismatch: Expected axis has 60 elements, new values have 120 elements

经过一番搜索后,我知道错误是由于我尝试分配的列数大于现有列,但我仍然无法解决这个问题。

我还尝试了几种方法,如 pd.MultiIndex.from_tuplespd.MultiIndex.from_arrays,但产生了其他错误。

编辑:
这是一个可重现的例子

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(1,4), columns=[0,1,0,1])
df.columns = pd.MultiIndex.from_product([['A','B'], df.columns])
print(df)

任何人都可以指出解决这个问题的方法吗? 提前致谢。

【问题讨论】:

  • 请编辑您的问题以包含 minimal reproducible example 以显示您的输入数据帧样本和预期输出,以便我们重新创建您的示例。
  • 嗨@Paul,我编辑了帖子,请看一下。谢谢!
  • 我相信@AlexK 已经为您提供了解决方案

标签: python dataframe multi-index


【解决方案1】:

IIUC,你只需要创建一个AB的重复序列,序列的长度等于你当前列的数量。你可以使用numpy来完成:

import numpy as np

df.columns = pd.MultiIndex.from_arrays(
    [np.repeat(['A','B'], df.shape[1] // 2), df.columns]
)

上面的第一个数组看起来像['A','A','B','B',...]


更新:

为了回答您在下面的 cmets 中的后续问题,如果您有奇数列,您可以利用 np.resize 创建一个完整的交替数组 A's 和 B's(即 @987654330 @) 的长度等于数据框中的列数。然后,您可以将该数组传递给pd.MultiIndex.from_arrays()

df.columns = pd.MultiIndex.from_arrays(
    [np.resize(np.repeat(['A','B'], 2), df.shape[1]), df.columns]
)

【讨论】:

  • 谢谢@AlexK 的回答,我还有一个问题!如果列数为奇数,如何添加此级别?我知道它会出错,我想知道是否有解决方法?
  • @AdelMoustafa 你是说会有 61 列,还是说会有三个值,比如 A、B 和 C?你需要什么结果?你能举个例子吗?您可以编辑您的问题并将其包含在此处。
  • 我的意思是你所说的列数,我想我会用一个简单的 if-else 来检查列数(如果它甚至作为你的解决方案继续进行,如果不添加一个虚拟列来制作列数甚至继续你的解决方案)。我想知道是否有更好的方法来处理这个问题?谢谢
  • @AdelMoustafa,查看我更新的答案
猜你喜欢
  • 2021-06-25
  • 2021-06-11
  • 2022-01-23
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多