我试图将一行分层索引的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的回答让我意识到我过度简化问题之后修改了问题。
答案 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将始终调整数据,这就是为什么它不能自然地发挥作用。你故意不对齐。