Как добавить DataFrame в мультииндексный DataFrame? - PullRequest
0 голосов
/ 01 февраля 2019

Предположим, что у меня есть фреймы данных

In [1]: a=pd.DataFrame([[1,2],[3,4],[5,6],[7,8]],  
   ...:     index=pd.MultiIndex.from_product([('A','B'),('d','e')]))                                    

In [2]: a                                                                                               
Out[2]: 
     0  1
A d  1  2
  e  3  4
B d  5  6
  e  7  8

In [3]: b=pd.DataFrame([[9,10],[11,12]],index=('d','e'))                                                

In [4]: b                                                                                               
Out[4]: 
    0   1
d   9  10
e  11  12

, и я хочу добавить b к a с субиндексом C, получая DataFrame

      0   1
A d   1   2
  e   3   4
B d   5   6
  e   7   8
C d   9  10
  e  11  12

Я пытался

In [5]: a.loc['C'] = b 

, но получил

TypeError: 'int' object is not iterable

Как мне это сделать?

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Присвойте новое значение b, затем set_index и swaplevel до append до a

a.append(b.assign(k='C').set_index('k',append=True).swaplevel(0,1))
Out[33]: 
      0   1
A d   1   2
  e   3   4
B d   5   6
  e   7   8
C d   9  10
  e  11  12
0 голосов
/ 01 февраля 2019

Если хотите пошагово;

df2 = pd.concat([a,b], ignore_index=True)
df2['i0'] = a.index.get_level_values(0).tolist() + ['C']*len(b)
df2['i1'] = a.index.get_level_values(0).union(b.index)
df2.set_index(['i0', 'i1'])

Выходы

         0  1
i0  i1      
A   A   1   2
A       3   4
B   B   5   6
B       7   8
C   d   9   10
e       11  12
0 голосов
/ 01 февраля 2019

Сначала обновите индекс b, чтобы он соответствовал тем же уровням, что и a, затем concat:

b.index = pd.MultiIndex.from_arrays([('C','C'), ('d','e')])
pd.concat([a,b]))])
...