pandas - 如何合并具有层次结构的两个数据框
问题描述
我正在尝试合并两个具有相同级别 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上。关于如何获得正确结果的任何想法?
解决方案
到目前为止没有答案,然后我找到了一个解决方法:首先我加入了 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 的方式,但目前这是最好的解决方案。
推荐阅读
- windows-installer - 以管理员身份为普通用户部署 MSI 文件
- python - sqlite3 通过客户端工作,但在 python 中不起作用
- c# - 搜索特定字符的字符串并将其嵌入代码
- reactjs - 使用 Create React App 在运行时加载静态文件
- python - Python 2d 矩阵类错误
- c# - 无法运行 xaml 和 c# 示例
- javascript - 创建根据表格行更改的元素 UI 工具提示内容
- shell - 使用 shell 列出列表中不存在的现有文件
- javascript - JS中的自定义排序/路径查找
- postgresql - PostgreSQL:指向其他表的表?