如何将一个分层索引的Pandas DataFrame的一行分配给另一行?

时间:2014-05-15 18:56:31

标签: python pandas

我试图将一行分层索引的Pandas DataFrame分配给DataFrame的另一行。以下是一个最小的例子。

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填充第0行,而不是第1行中的值。我注意到我可以在分配之前转换为ndarray来绕过它:

data.loc[0, 'a'] = np.array(data.loc[1, 'b'])

据推测,出现这种行为的原因是什么,以及进行转让的惯用方法?

编辑:在Jeff的回答让我意识到我过度简化问题之后修改了问题。

1 个答案:

答案 0 :(得分:1)

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)。

In [42]: data.loc[0,'a'] = data.loc[1,:]

In [43]: data
Out[43]: 
          a          
          0         1
0  0.700830  1.688279
1  0.700830  1.688279
2 -0.912225 -0.199431

你也可以

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

Pandas将始终调整数据,这就是为什么它不能自然地发挥作用。你故意不对齐。