Python 如何将分层索引数据帧的一行分配给另一行?

Python 如何将分层索引数据帧的一行分配给另一行?,python,pandas,Python,Pandas,我试图将层次索引数据帧的一行分配给数据帧的另一行。下面是一个简单的例子 import numpy as np import pandas as pd columns = pd.MultiIndex.from_tuples([('a', 0), ('a', 1), ('b', 0), ('b', 1)]) data = pd.DataFrame(np.random.randn(3, 4), columns=columns) print(data) data.loc[0, 'a'] =

我试图将层次索引数据帧的一行分配给数据帧的另一行。下面是一个简单的例子

import numpy as np    
import pandas as pd

columns = pd.MultiIndex.from_tuples([('a', 0), ('a', 1), ('b', 0), ('b', 1)])
data = pd.DataFrame(np.random.randn(3, 4), columns=columns)

print(data)
data.loc[0, 'a'] = data.loc[1, 'b']
print(data)
这将使用
NaN
s而不是第1行中的值填充第0行。我注意到,在分配任务之前,我可以通过转换为
ndarray
来解决这个问题:

data.loc[0, 'a'] = np.array(data.loc[1, 'b'])
大概这种行为是有原因的,还有一种惯用的分配方式

编辑:在杰夫的回答让我意识到我把问题简化了之后,修改了这个问题

In [38]: data = pd.DataFrame(np.random.randn(3, 2), columns=columns)

In [39]: data
Out[39]: 
          a          
          0         1
0  1.657540 -1.086500
1  0.700830  1.688279
2 -0.912225 -0.199431

In [40]: data.loc[0,'a']
Out[40]: 
0    1.65754
1   -1.08650
Name: 0, dtype: float64

In [41]: data.loc[1,'a']
Out[41]: 
0    0.700830
1    1.688279
Name: 1, dtype: float64
在您的示例中,请注意指定元素的索引为[0,1];这些不匹配的列是('a',0),('a',1)。因此,您最终将有效地重新索引到不存在的元素,从而得到
nan

总的来说,最好让熊猫“算出”rhs路线(就像你在这里所做的那样,遮住lhs)

你也可以

data.loc[0] = data.loc[1]
还有一种方法:

In [96]: data = pd.DataFrame(np.arange(12).reshape(3,4), columns=pd.MultiIndex.from_product([['a','b'],[0,1]]))

In [97]: data
Out[97]: 
   a      b    
   0  1   0   1
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

In [98]: data.loc[0,'a'] = data.loc[1,'b'].values

In [99]: data
Out[99]: 
   a      b    
   0  1   0   1
0  6  7   2   3
1  4  5   6   7
2  8  9  10  11

熊猫总是会将数据对齐,这就是为什么它不能正常工作的原因。您故意不对齐。

我实际上是想将一对列中的一行指定给另一对列中的一行。也就是说,我有一个名为“a”的对和一个名为“b”的对,希望分配
data.loc[0,'a']=data.loc[1,'b']
。你的回答回答了我的问题,但并不能解决我稍微复杂一点的需求。
In [96]: data = pd.DataFrame(np.arange(12).reshape(3,4), columns=pd.MultiIndex.from_product([['a','b'],[0,1]]))

In [97]: data
Out[97]: 
   a      b    
   0  1   0   1
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

In [98]: data.loc[0,'a'] = data.loc[1,'b'].values

In [99]: data
Out[99]: 
   a      b    
   0  1   0   1
0  6  7   2   3
1  4  5   6   7
2  8  9  10  11