将单索引DataFrame复制到MultiIndex DataFrame [英] copying a single-index DataFrame into a MultiIndex DataFrame

查看:308
本文介绍了将单索引DataFrame复制到MultiIndex DataFrame的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在以下位置找到了我的答案:从现有的DataFrames

found my answer here: Building a hierarchically indexed DataFrame from existing DataFrames

结果是我需要创建一个匹配的MultiIndex并固定更高的级别

Turns out I need to create a matching MultiIndex with the higher levels fixed

原文:

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

I confess, I don't understand the merges and joins yet, but I'm not sure they're what I want.

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

I have a DataFrame that has a single index, and a DataFrame that has a MultiIndex, the last level of which is the same as the single-index DataFrame.

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

I am trying to copy/graft the contents in:

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

我在做什么错了?

当我按索引进行索引时,它可以工作,但是肯定不是熊猫方式:

it works when I do index by index, but that's not the pandas way, surely:

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是等效的(更明确)

.ix and .loc are equivalent in this example (just more explicit)

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系列有关;这可能是一个小虫

This should probably work with a series on the rhs; this might be a 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

这篇关于将单索引DataFrame复制到MultiIndex DataFrame的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆