df1的单个索引与df2的多指数子级匹配。两者都有相同的列。我想将df1的所有行和列复制到df2。
它类似于这个帖子: copying a single-index DataFrame into a MultiIndex DataFrame
但该解决方案仅适用于一个索引值,索引' a'在这种情况下。我想对df1的所有索引执行此操作。
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: import itertools
In [4]: inner = ('a','b')
In [5]: outer = ((10,20), (1,2))
In [6]: cols = ('one','two','three','four')
In [7]: sngl = pd.DataFrame(np.random.randn(2,4), index=inner, columns=cols)
In [8]: index_tups = list(itertools.product(*(outer + (inner,))))
In [9]: index_mult = pd.MultiIndex.from_tuples(index_tups)
In [10]: mult = pd.DataFrame(index=index_mult, columns=cols)
In [11]: sngl
Out[11]:
one two three four
a 2.946876 -0.751171 2.306766 0.323146
b 0.192558 0.928031 1.230475 -0.256739
In [12]: mult
Out[12]:
one two three four
10 1 a NaN NaN NaN NaN
b NaN NaN NaN NaN
2 a NaN NaN NaN NaN
b NaN NaN NaN NaN
20 1 a NaN NaN NaN NaN
b NaN NaN NaN NaN
2 a NaN NaN NaN NaN
b NaN NaN NaN NaN
In [13]: mult.ix[(10,1)] = sngl
In [14]: mult
Out[14]:
one two three four
10 1 a NaN NaN NaN NaN
b NaN NaN NaN NaN
2 a NaN NaN NaN NaN
b NaN NaN NaN NaN
20 1 a NaN NaN NaN NaN
b NaN NaN NaN NaN
2 a NaN NaN NaN NaN
b NaN NaN NaN NaN
@Jeff给出的解决方案是
nm = mult.reset_index().set_index('level_2')
nm.loc['a',sngl.columns] = sngl.loc['a'].values
level_0 level_1 one two three four
level_2
a 10 1 0.3738456 -0.2261926 -1.205177 0.08448757
b 10 1 NaN NaN NaN NaN
a 10 2 0.3738456 -0.2261926 -1.205177 0.08448757
b 10 2 NaN NaN NaN NaN
a 20 1 0.3738456 -0.2261926 -1.205177 0.08448757
b 20 1 NaN NaN NaN NaN
a 20 2 0.3738456 -0.2261926 -1.205177 0.08448757
b 20 2 NaN NaN NaN NaN
我不能这样做:
nm.loc[:,sngl.columns] = sngl.loc[:].values
它会引发ValueError:"无法将大小为X的序列复制到具有维度Y&#34的数组轴;
我目前正在使用循环。但这不是熊猫的方式。
答案 0 :(得分:1)
这感觉有点过于手工,但在实践中我可能会做这样的事情:
In [46]: mult[:] = sngl.loc[mult.index.get_level_values(2)].values
In [47]: mult
Out[47]:
one two three four
10 1 a 1.175042 0.044014 1.341404 -0.223872
b 0.216168 -0.748194 -0.546003 -0.501149
2 a 1.175042 0.044014 1.341404 -0.223872
b 0.216168 -0.748194 -0.546003 -0.501149
20 1 a 1.175042 0.044014 1.341404 -0.223872
b 0.216168 -0.748194 -0.546003 -0.501149
2 a 1.175042 0.044014 1.341404 -0.223872
b 0.216168 -0.748194 -0.546003 -0.501149
即,首先选择我们想要用于索引的元素:
In [64]: mult.index.get_level_values(2)
Out[64]: Index(['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b'], dtype='object')
然后使用这些索引到sngl
:
In [65]: sngl.loc[mult.index.get_level_values(2)]
Out[65]:
one two three four
a 1.175042 0.044014 1.341404 -0.223872
b 0.216168 -0.748194 -0.546003 -0.501149
a 1.175042 0.044014 1.341404 -0.223872
b 0.216168 -0.748194 -0.546003 -0.501149
a 1.175042 0.044014 1.341404 -0.223872
b 0.216168 -0.748194 -0.546003 -0.501149
a 1.175042 0.044014 1.341404 -0.223872
b 0.216168 -0.748194 -0.546003 -0.501149
然后我们可以使用.values
丢弃索引信息,只需填充原始数组。
它不是很优雅,但它很简单。