我有两个多索引的 pandas 数据框,如下所示:
>>> df1 = pd.DataFrame({
... ('y1', '0'): [1, 2, 3],
... ('y2', '0'): [4, 5, 6],
... ('y11', '0'): [7, 8, 9],
... })
>>> df2 = pd.DataFrame({
... ('y1', '1'): [1.5, 2.5, 3.5],
... ('y2', '1'): [4.5, 5.5, 6.5],
... ('y11', '1'): [7.5, 8.5, 9.5],
... })
我想将它们连接起来,使结果看起来像:
>>> df = pd.DataFrame({
... ('y1', '0'): [1, 2, 3],
... ('y1', '1'): [1.5, 2.5, 3.5],
... ('y2', '0'): [4, 5, 6],
... ('y2', '1'): [4.5, 5.5, 6.5],
... ('y11', '0'): [7, 8, 9],
... ('y11', '1'): [7.5, 8.5, 9.5],
... })
即多索引第一层的阶数:y1; y2; y11 被保留,而第二层被合理地交错。
连接两个多索引数据帧以保留多索引第一级的顺序的解决方案是什么?
如果我使用:
>>> df = pd.concat((df1, df2), axis="columns").sort_index(axis="columns")
它几乎可以工作,但是第一级的顺序被搞乱了(按字典顺序)为
y1
, y11
, y2
>>> print(df)
y1 y11 y2
0 1 0 1 0 1
0 1 1.5 7 7.5 4 4.5
1 2 2.5 8 8.5 5 5.5
2 3 3.5 9 9.5 6 6.5
我可以使用复杂的正则表达式来做到这一点,但我认为应该有比这更好的解决方案。
concat
、sort_index
,然后使用df1
恢复所需的顺序:
out = (pd.concat([df1, df2], axis=1)
.sort_index(axis=1, level=0)
[df1.columns.get_level_values(0)]
)
输出:
y1 y2 y11
0 1 0 1 0 1
0 1 1.5 4 4.5 7 7.5
1 2 2.5 5 5.5 8 8.5
2 3 3.5 6 6.5 9 9.5