如何将单索引和多级索引的Pandas数据帧合并

9
我将尝试连接多个Pandas DataFrames,其中一些使用多级索引,另一些使用单个索引。例如,让我们考虑以下单个索引数据帧:
> 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

我该如何使用 concatmergejoindf1df2 生成这个数据框?
2个回答

4

我认为你不能避免将单列索引转换为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

谢谢@chrisb!我本来希望有一个更简单、更通用的方法,但是通过你的解决方案,我能够制定一个解决办法,满足我的需求。 - wbinventor

3
如果您只是在追加一列数据,您可以将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

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