Skip to main content
 首页 » 编程设计

python之将单索引 DataFrame 复制到 MultiIndex DataFrame

2025年05月04日9zlslch

编辑:在这里找到我的答案:Building a hierarchically indexed DataFrame from existing DataFrames

原来我需要创建一个匹配的 MultiIndex 并修复了更高的级别

原文:

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

我有一个具有单个索引的 DataFrame 和一个具有 MultiIndex 的 DataFrame,其最后一级与单索引 DataFrame 相同。

我正在尝试复制/嫁接以下内容:

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

我做错了什么?

编辑:当我按索引进行索引时它会起作用,但这肯定不是 pandas 的方式:

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 在这个例子中是等价的(只是更明确)

In [48]: nm = mult.reset_index().set_index('level_2') 
 
In [49]: nm 
Out[49]:  
         level_0  level_1  one  two three four 
level_2                                        
a             10        1  NaN  NaN   NaN  NaN 
b             10        1  NaN  NaN   NaN  NaN 
a             10        2  NaN  NaN   NaN  NaN 
b             10        2  NaN  NaN   NaN  NaN 
a             20        1  NaN  NaN   NaN  NaN 
b             20        1  NaN  NaN   NaN  NaN 
a             20        2  NaN  NaN   NaN  NaN 
b             20        2  NaN  NaN   NaN  NaN 

这可能适用于 rhs 上的系列;这可能是一个 buglet

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