如何将DataFrame附加到多级索引的DataFrame?

4
假设我有数据框:
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 附加到有子索引 Ca 上,生成 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个回答

4

将新值分配给b,然后在a上执行append之前执行set_indexswaplevel

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

2
我使用了相同的技巧,只不过我使用了 pd.concat 而不是 append。 - Scott Boston
1
谢谢,这正是我所需要的。 - bmello

1

首先将b的索引更新为与a相同级别,然后连接:

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

谢谢Kyle,这是一个好的解决方案,但我最喜欢的是@Wen-Ben的,因为它不会改变原始数据框。 - bmello

0

如果想要逐步操作;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接