连接多索引数据帧时如何保留列的顺序?

问题描述 投票:0回答:1

我有两个多索引的 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

我可以使用复杂的正则表达式来做到这一点,但我认为应该有比这更好的解决方案。

python pandas dataframe multi-index
1个回答
0
投票

一个简单的选择可能是

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
© www.soinside.com 2019 - 2024. All rights reserved.