我有两个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
我怎么能做到这一点?谢谢!
答案 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