为另一个MultiIndexed Dataframe加入MultiIndexed Pandas Dataframe

时间:2014-05-06 12:14:12

标签: python pandas

我有两个pandas数据帧,每个数据帧都有一个列的多索引,如下所示:

d1 = {('a', 'c'):1, ('a', 'd'):1, ('b', 'c'):1, ('b', 'd'):1}
d2 = {('a', 'c'):2, ('a', 'd'):2, ('b', 'c'):2, ('b', 'd'):2}
df1 = pd.DataFrame ([d1, d2])
df2 = pd.DataFrame ([d2, d2]).map (lambda x: x*2)

df1.columns = pd.MultiIndex.from_tuples (df1.columns)
df2.columns = pd.MultiIndex.from_tuples (df2.columns)

In [62]: df1
Out[62]: 
   a     b   
   c  d  c  d
0  1  1  1  1
1  1  1  1  1

[2 rows x 4 columns]

In [63]: df2
Out[63]: 
   a     b   
   c  d  c  d
0  2  2  2  2
1  2  2  2  2

[2 rows x 4 columns]

我想将两个数据框合并在一起,以便在列的顶层是其源自的数据帧的名称,然后是当前列名称的列上实现层次结构索引。也就是说,

In [64]: merged_df.df1.a.c
Out[64]: 
0    1
1    1
Name: c, dtype: int64

In [64]: merged_df.df2.a.c
Out[64]: 
0    2
1    2
Name: c, dtype: int64

我怎么能做到这一点?谢谢!

1 个答案:

答案 0 :(得分:3)

你不应该在帧上使用map,FYI(无论如何都不存在),你可以使用applymap,但是使用矢量化操作会更有效率

In [12]: df2 = pd.DataFrame ([d2, d2])**2

In [14]: df2.columns = pd.MultiIndex.from_tuples (df2.columns)

In [15]: df2
Out[15]: 
   a     b   
   c  d  c  d
0  4  4  4  4
1  4  4  4  4

[2 rows x 4 columns]

In [16]: df1
Out[16]: 
   a     b   
   c  d  c  d
0  1  1  1  1
1  2  2  2  2

[2 rows x 4 columns]

一起使用concat并使用keys参数

In [18]: concat([df1,df2],keys=['df1','df2'],axis=1)
Out[18]: 
   df1           df2         
     a     b       a     b   
     c  d  c  d    c  d  c  d
0    1  1  1  1    4  4  4  4
1    2  2  2  2    4  4  4  4

[2 rows x 8 columns]

In [19]: concat([df1,df2],keys=['df1','df2'],axis=1).df2.a.c
Out[19]: 
0    4
1    4
Name: c, dtype: int64