举个例子可能更容易理解,所以我们来:

random = np.random.uniform(size=(3))

what_i_have = pd.DataFrame({ 
    ('a', 'a'): random,
    ('b', 'b1'): np.linspace(3, 5, 3),
    ('b', 'b2'): np.linspace(6, 8, 3),
    ('b', 'b3'): np.linspace(9, 11, 3)
})

what_i_want = pd.DataFrame({
    ('a', 'a'): np.concatenate((random, random, random)),
    ('b', 'b_category'): ['b1']*3 + ['b2']*3 + ['b3']*3,
    ('b', 'b_value'): np.linspace(3, 11, 9)
})

print(what_i_have)
print('----------------------------------')
print(what_i_want)

输出:

          a    b           
          a   b1   b2    b3
0  0.587075  3.0  6.0   9.0
1  0.798710  4.0  7.0  10.0
2  0.206860  5.0  8.0  11.0
----------------------------------
          a          b        
          a b_category b_value
0  0.587075         b1     3.0
1  0.798710         b1     4.0
2  0.206860         b1     5.0
3  0.587075         b2     6.0
4  0.798710         b2     7.0
5  0.206860         b2     8.0
6  0.587075         b3     9.0
7  0.798710         b3    10.0
8  0.206860         b3    11.0

我的问题是,我的数据不仅有b1 b2 b3,还有b4,b5,b6...一直到b90左右.显而易见的解决方案是创建一个循环,创建90个数据帧,每个类别一个,然后将它们连接到一个数据帧中,但我认为一定有更好的方法.

编辑:

what_i_have.unstack()并不能真正解决这个问题,如下所示.这可能是一个中间步骤,但在达到我想要的结果之前,仍有一些工作要做,我不认为这样做比我之前提到的循环解决方案有多大优势:

a  a   0     0.587075
       1     0.798710
       2     0.206860
b  b1  0     3.000000
       1     4.000000
       2     5.000000
   b2  0     6.000000
       1     7.000000
       2     8.000000
   b3  0     9.000000
       1    10.000000
       2    11.000000

推荐答案

保留多索引可能是更好的解决方法:

df = df.melt(id_vars=[df.columns[0]], var_name=['b','b_category'], value_name='b_value')
a = df[[('a','a')]]
b = df[['b', 'b_category', 'b_value']].pivot(columns='b').swaplevel(0,1, axis=1)
df = pd.concat([a, b], axis=1)
df.columns = pd.MultiIndex.from_tuples(df.columns)
print(df)

输出:

          a          b
          a b_category b_value
0  0.737076         b1     3.0
1  0.718409         b1     4.0
2  0.269516         b1     5.0
3  0.737076         b2     6.0
4  0.718409         b2     7.0
5  0.269516         b2     8.0
6  0.737076         b3     9.0
7  0.718409         b3    10.0
8  0.269516         b3    11.0

Python相关问答推荐

非常奇怪:tzLocal.get_Localzone()基于python3别名的不同输出?

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

pandas滚动和窗口中有效观察的最大数量

根据二元组列表在pandas中创建新列

为什么默认情况下所有Python类都是可调用的?

如何在Python中并行化以下搜索?

如何使用它?

形状弃用警告与组合多边形和多边形如何解决

不能使用Gekko方程'

python中的解释会在后台调用函数吗?

将pandas导出到CSV数据,但在此之前,将日期按最小到最大排序

为什么常规操作不以其就地对应操作为基础?

提高算法效率的策略?

通过追加列表以极向聚合

递归函数修饰器

一个telegram 机器人应该发送一个测验如何做?""

如何在Python中自动创建数字文件夹和正在进行的文件夹?

一维不匹配两个数组上的广义ufunc

具有不同坐标的tkinter canvs.cocords()和canvs.moveto()

将Pandas DataFrame中的列名的长文本打断/换行为_STRING输出?