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