Python 将单个索引数据帧复制到多索引数据帧

Python 将单个索引数据帧复制到多索引数据帧,python,pandas,Python,Pandas,编辑:在此处找到我的答案: 结果是我需要创建一个匹配的多索引,并固定较高的级别 原件: 我承认,我还不了解合并和加入,但我不确定它们是否是我想要的 我有一个数据帧,它有一个单索引,还有一个数据帧,它有一个多索引,最后一级与单索引数据帧相同 我正在尝试复制/移植以下内容: In [1]: import pandas as pd In [2]: import numpy as np In [3]: import itertools In [4]: In [4]: inner = ('a',

编辑:在此处找到我的答案:

结果是我需要创建一个匹配的多索引,并固定较高的级别

原件:

我承认,我还不了解合并和加入,但我不确定它们是否是我想要的

我有一个数据帧,它有一个单索引,还有一个数据帧,它有一个多索引,最后一级与单索引数据帧相同

我正在尝试复制/移植以下内容:

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: import itertools

In [4]: 

In [4]: inner = ('a','b')

In [5]: outer = ((10,20), (1,2))

In [6]: cols = ('one','two','three','four')

In [7]: 

In [7]: sngl = pd.DataFrame(np.random.randn(2,4), index=inner, columns=cols)

In [8]: 

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]: 

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]: 

In [13]: mult.ix[(10,1)] = sngl

In [14]: 

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

In [15]: 
我做错了什么

编辑:当我一个索引一个索引的时候,它是有效的,但这不是熊猫的方式,当然:

In [15]: mult.ix[(10,1,'a')] = sngl.ix['a']

In [16]: mult
Out[16]: 
             one        two     three       four
10 1 a  2.946876 -0.7511706  2.306766  0.3231457
     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

.ix
.loc
在本例中是等效的(只是更明确)

这可能适用于rhs上的系列;这可能是小号

In [50]: nm.loc['a',sngl.columns] = sngl.loc['a'].values

In [51]: nm
Out[51]: 
         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

In [52]: nm.reset_index().set_index(['level_0','level_1','level_2'])
Out[52]: 
                               one        two     three        four
level_0 level_1 level_2                                            
10      1       a        0.3738456 -0.2261926 -1.205177  0.08448757
                b              NaN        NaN       NaN         NaN
        2       a        0.3738456 -0.2261926 -1.205177  0.08448757
                b              NaN        NaN       NaN         NaN
20      1       a        0.3738456 -0.2261926 -1.205177  0.08448757
                b              NaN        NaN       NaN         NaN
        2       a        0.3738456 -0.2261926 -1.205177  0.08448757
                b              NaN        NaN       NaN         NaN

一般来说,您确实希望构建这些(而不是替换),效率更高,但如果您真的想做您正在做的事情(并且存在有效的用例),例如,假设您只想替换帧的一部分…在这种情况下,我有一个方法返回给我一个数据帧,并且我多次调用它,将结果合并回一个更大的数据帧,然后我可以进行分析。我知道总体大小,所以我先创建它,然后复制到中;构建然后修改不是很有效。loc over.ix证明是一件大事。如何将所有sng1行连接到nm。nm.loc[:,sngl.columns]=sngl.loc[:]。值不起作用。
In [50]: nm.loc['a',sngl.columns] = sngl.loc['a'].values

In [51]: nm
Out[51]: 
         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

In [52]: nm.reset_index().set_index(['level_0','level_1','level_2'])
Out[52]: 
                               one        two     three        four
level_0 level_1 level_2                                            
10      1       a        0.3738456 -0.2261926 -1.205177  0.08448757
                b              NaN        NaN       NaN         NaN
        2       a        0.3738456 -0.2261926 -1.205177  0.08448757
                b              NaN        NaN       NaN         NaN
20      1       a        0.3738456 -0.2261926 -1.205177  0.08448757
                b              NaN        NaN       NaN         NaN
        2       a        0.3738456 -0.2261926 -1.205177  0.08448757
                b              NaN        NaN       NaN         NaN