【问题标题】:Merge two pandas Dataframes adding multiindex column level and preserving initial order合并两个熊猫数据框,添加多索引列级别并保留初始顺序
【发布时间】:2021-09-02 07:39:21
【问题描述】:

我试图弄清楚如何合并两个(或更多)熊猫数据框,如下所示:

df1:

   |    ant    |       nac       |
   | uyn | yam | qlv | udb | rkd |
---|-----|-----|-----|-----|-----|
X1 |  6  |  1  |  8  |  4  |  5  |
X2 |  4  |  5  |  3  |  5  |  4  |
X3 |  2  |  9  |  2  |  9  |  4  |

df2:

   |    baz    |       ant       |
   | rjv | ifz | uyn | pgc | yam |
---|-----|-----|-----|-----|-----|
X1 |  2  |  1  |  7  |  3  |  8  |
X2 |  9  |  7  |  3  |  1  |  4  |
X3 |  2  |  1  |  6  |  2  |  9  |

进入这样的数据框:

   |             ant             |       nac       |    baz    |
   |    uyn    |    yam    | pgc | qlv | udb | rkd | rjv | ifz |
   | df1 | df2 | df1 | df2 | df2 | df1 | df1 | df1 | df2 | df2 |
X1 |  6  |  7  |  1  |  8  |  3  |  8  |  4  |  5  |  2  |  1  |
X2 |  4  |  3  |  5  |  3  |  1  |  3  |  5  |  4  |  9  |  7  |
X3 |  2  |  6  |  9  |  2  |  2  |  2  |  9  |  4  |  2  |  1  |

我尝试使用concat,但随后卡住了按正确顺序对每个级别中的项目进行排序(因为项目未按字母顺序排序)。尝试reindex 并以很多空列结束,因为 *udb` 上的 ant 等的交叉点。

也许我把事情复杂化了。有没有更简单的方法来做到这一点?

【问题讨论】:

标签: python pandas


【解决方案1】:

尝试使用concatkeys 然后reorder_levels

new_df = (
    pd.concat((df1, df2), axis=1, keys=('df1', 'df2'))
        .reorder_levels([1, 2, 0], axis=1)
)

可选的以编程方式为“或更多”情况分配键:

dfs = (df1, df2)
new_df = (
    pd.concat(dfs, axis=1, keys=map('df{}'.format, range(1, len(dfs) + 1)))
        .reorder_levels([1, 2, 0], axis=1)
)
   ant     nac         baz     ant        
   uyn yam qlv udb rkd rjv ifz uyn pgc yam
   df1 df1 df1 df1 df1 df2 df2 df2 df2 df2
X1   6   1   8   4   5   2   1   7   3   8
X2   4   5   3   5   4   9   7   3   1   4
X3   2   9   2   9   4   2   1   6   2   9

然后尝试连续 reindex 按第一次出现“排序”:

new_df = (
    new_df.reindex(
        columns=new_df.columns.get_level_values(0).drop_duplicates(),
        level=0
    ).reindex(
        columns=new_df.columns.get_level_values(1).drop_duplicates(),
        level=1
    )
)
   ant                 nac         baz    
   uyn     yam     pgc qlv udb rkd rjv ifz
   df1 df2 df1 df2 df2 df1 df1 df1 df2 df2
X1   6   7   1   8   3   8   4   5   2   1
X2   4   3   5   4   1   3   5   4   9   7
X3   2   6   9   9   2   2   9   4   2   1

df1df2 使用:

df1 = pd.DataFrame({('ant', 'uyn'): {'X1': 6, 'X2': 4, 'X3': 2},
                    ('ant', 'yam'): {'X1': 1, 'X2': 5, 'X3': 9},
                    ('nac', 'qlv'): {'X1': 8, 'X2': 3, 'X3': 2},
                    ('nac', 'udb'): {'X1': 4, 'X2': 5, 'X3': 9},
                    ('nac', 'rkd'): {'X1': 5, 'X2': 4, 'X3': 4}})

df2 = pd.DataFrame({('baz', 'rjv'): {'X1': 2, 'X2': 9, 'X3': 2},
                    ('baz', 'ifz'): {'X1': 1, 'X2': 7, 'X3': 1},
                    ('ant', 'uyn'): {'X1': 7, 'X2': 3, 'X3': 6},
                    ('ant', 'pgc'): {'X1': 3, 'X2': 1, 'X3': 2},
                    ('ant', 'yam'): {'X1': 8, 'X2': 4, 'X3': 9}})

【讨论】:

  • 是的,我已经尝试过了,但 sort_index 只是按字母顺序对它们进行排序,我需要它们以它们出现在数据框中的顺序。
猜你喜欢
  • 2017-09-21
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
相关资源
最近更新 更多