我正在尝试连接多个Pandas DataFrame,其中一些使用多索引,而另一些则使用单个索引。作为示例,让我们考虑以下单个索引数据帧:
> import pandas as pd
> df1 = pd.DataFrame({'single': [10,11,12]})
> df1
single
0 10
1 11
2 12
与多索引数据框一起使用:
> level_dict = {}
> level_dict[('level 1','a','h')] = [1,2,3]
> level_dict[('level 1','b','j')] = [5,6,7]
> level_dict[('level 2','c','k')] = [10, 11, 12]
> level_dict[('level 2','d','l')] = [20, 21, 22]
> df2 = pd.DataFrame(level_dict)
> df2
level 1 level 2
a b c d
h j k l
0 1 5 10 20
1 2 6 11 21
2 3 7 12 22
现在我想连接两个数据帧。当我尝试使用concat
时,它会按照以下方式展平多索引:
> df3 = pd.concat([df2,df1], axis=1)
> df3
(level 1, a, h) (level 1, b, j) (level 2, c, k) (level 2, d, l) single
0 1 5 10 20 10
1 2 6 11 21 11
2 3 7 12 22 12
如果我将一个列附加到多索引数据框df2
,如下所示:
> df2['single'] = [10,11,12]
> df2
level 1 level 2 single
a b c d
h j k l
0 1 5 10 20 10
1 2 6 11 21 11
2 3 7 12 22 12
如何使用df1
,df2
或concat
从merge
和join
生成此数据框?
答案 0 :(得分:2)
我认为您无法避免将单个索引转换为MultiIndex
。这可能是最简单的方法,您也可以在加入后进行转换。
In [48]: df1.columns = pd.MultiIndex.from_tuples([(c, '', '') for c in df1])
In [49]: pd.concat([df2, df1], axis=1)
Out[49]:
level 1 level 2 single
a b c d
h j k l
0 1 5 10 20 10
1 2 6 11 21 11
2 3 7 12 22 12
答案 1 :(得分:1)
如果您只是附加一列,则可以基本上以系列的形式访问df1:
df2[df1.columns[0]] = df1.iloc[:, 0]
df2
level 1 level 2 single
a b c d
h j k l
0 1 5 10 20 10
1 2 6 11 21 11
2 3 7 12 22 12
如果你刚开始制作一个系列剧,那么阅读会更容易一些。这个命令会做同样的事情:
ser1 = df1.iloc[:, 0] # make df1's column into a series
df2[ser1.name] = ser1