Python 如何将嵌套列添加到三维数据帧?

Python 如何将嵌套列添加到三维数据帧?,python,python-3.x,pandas,numpy,dataframe,Python,Python 3.x,Pandas,Numpy,Dataframe,熊猫新手,不太清楚3D数据框是如何工作的。我的数据帧名为'new',如下所示: unique cat numerical a b c d e f 0 0 1 2 3 4 5 1 0 1 2 3 4 5 unique cat numerical a b z c d

熊猫新手,不太清楚3D数据框是如何工作的。我的数据帧名为
'new'
,如下所示:

     unique    cat    numerical   
          a  b   c  d         e  f
   0      0  1   2  3         4  5
   1      0  1   2  3         4  5
     unique       cat    numerical   
          a  b  z   c  d         e  f
   0      0  1  9   2  3         4  5
   1      0  1  9   2  3         4  5
new['unique'] = 'a'
我想插入列
'z'
,这样它的结果如下:

     unique    cat    numerical   
          a  b   c  d         e  f
   0      0  1   2  3         4  5
   1      0  1   2  3         4  5
     unique       cat    numerical   
          a  b  z   c  d         e  f
   0      0  1  9   2  3         4  5
   1      0  1  9   2  3         4  5
new['unique'] = 'a'
从我的数据框中切出
'unique'
后,我成功地创建了一个新列:

这样做:

new_column = new.loc[:,'unique'].assign(z=pd.Series([9,9]).values)
给我这个:

   a  b  z
0  0  1  9
1  0  1  9
但是,我不知道如何将它放回数据帧。我试过:

new['unique'] = new_column
但后来我发现它只是尝试替换
'unique'
下所有行和列中的所有值,如下所示:

     unique    cat    numerical   
          a  b   c  d         e  f
   0      0  1   2  3         4  5
   1      0  1   2  3         4  5
     unique       cat    numerical   
          a  b  z   c  d         e  f
   0      0  1  9   2  3         4  5
   1      0  1  9   2  3         4  5
new['unique'] = 'a'
获取:

而使用
.loc
则会得到以下结果:

  unique     cat    numerical   
       a   b   c  d         e  f
0    NaN NaN   2  3         4  5
1    NaN NaN   2  3         4  5
以下是我的完整代码:

import pandas as pd
import numpy as np

data=[[0,1,2,3,4,5],[0,1,2,3,4,5]]
datatypes=np.array(['unique','unique','cat','cat','numerical','numerical'])
columnnames=np.array(['a','b','c','d','e','f'])
new = pd.DataFrame(data=data, columns=pd.MultiIndex.from_tuples(zip(datatypes,columnnames)))
print('new: ')
print(new)

new_column = new.loc[:,'unique'].assign(z=pd.Series([9,9]).values)
print('\nnew column:')
print(new_column)

new.loc[:,'unique'] = new_column
print('\nattempt 1:')
print(new)

new['unique'] = new_column
print('\nattempt 2:')
print(new)
一种方法是:

# Create your new multiindexed column:
new['unique','z'] = 9
# Re-order your columns in your desired order:
new = new[['unique', 'cat', 'numerical']]

>>> new
  unique       cat    numerical   
       a  b  z   c  d         e  f
0      0  1  9   2  3         4  5
1      0  1  9   2  3         4  5

您的数据生成过程是什么样子的?我假设z有两个以上的值。它可以在生成帧时添加吗?@ako我本来不想这样做,因为我认为继续重新排列数据列表中的值会非常麻烦,而且时间效率低下,但那是在我发现存在重新排列之前。。。再说一次,作为熊猫的新手,我甚至不知道我是否正在使用一种生成适合我的数据帧的方法。请阅读-总结是,这不是一种向志愿者致辞的理想方式,可能会对获得答案产生反作用。请不要把这个添加到你的问题中。该死,谢谢!我发誓我已经试过了,但没关系。另一方面,看看@ako所说的,在生成时添加所有列,然后重新排列表格,而不是在每次添加列后重新排列,会更快吗?好的,如果您实际上是手动生成数据,那么是的,最好包含数据。但我假设您想找到一种专门添加新数据的方法,在这种情况下,我认为重新生成所有数据并不是一个真正的选项。。。