首页 > 解决方案 > 如何合并具有层次结构的两个数据框

问题描述

我正在尝试合并两个具有相同级别 0 但级别不同的层次级别的数据框 1。合并函数似乎是最好用的,因为它像 SQL 一样工作,但我可能是错的。无论如何,如下两个数据框的视图。

df1:

   201001       | 201002      |  201003
   col1   col2  | col1   col2 |  col1   col2
A  123    456   | 123    456  |  ...    ...
B  789    123   | 789    123  |  ...    ...
C  456    789   | 456    789  |  ...    ...

df2:

   201001             |  201002             |  201003
   col3   col4   col5 |  col3   col4   col5 |  col3   col4   col5
A  123    456    123  |  456    123    456  |  456    456    789
B  789    123    789  |  123    789    789  |  123    456    123
C  456    789    456  |  789    123    456  |  456    789    789

正如我所说,级别0是相同的,行级别的索引是相同的,唯一的区别是级别1。我想要的结果如下:

   201001                           |  201002      
   col1   col2   col3   col4   col5 |  col1   col2   col3   col4   col5
A  123    456    123    456    123  |  123    456    456    123    456
B  789    123    789    123    789  |  789    123    123    789    789
C  456    789    456    789    456  |  456    789    789    123    456   

然后,要合并的键应该是级别 0 和行索引,而级别 1 上的列应该是附加的。我尝试使用 pd.merge(df1, df2, how='left', left_index=True, right_index=True) 和其他参数组合,但唯一的结果是数据帧只是附加在axis = 1上。关于如何获得正确结果的任何想法?

标签: pandasdataframemulti-index

解决方案


到目前为止没有答案,然后我找到了一个解决方法:首先我加入了 2 个数据框:

df_joined = df1.join(df2, how='inner')

这样我就有了一个带有公共索引的新数据框,但这不是我想要的,因为 2 个原始数据框只是附加在轴 = 1 上。然后我从 level(0) == '201001' 开始提取 level(0) 的值,创建一个新的数据框并遍历 level(0) 的值,我将每个块连接到第一个块:

for q in list_of_level_zero[1:]:
    df_to_concat = df_joined.iloc[:, df_joined.columns.get_level_values(0) == '%s' % q]
    # concatenate the previous dataframe to the one with level(0) == '201001'
    # keep looping

结果正是我需要的。我不知道是否有更 Pythonic 的方式,但目前这是最好的解决方案。


推荐阅读