【问题标题】:Python Pandas concatenate two multi index dataframe into one with another level of multi indexPython Pandas 将两个多索引数据帧与另一级多索引连接成一个
【发布时间】:2018-06-24 18:25:05
【问题描述】:

我再次处理多索引。这一次,我将两个具有相同类型的多索引索引和列的数据帧连接起来。但是,值不同,就会有 index.level(0) 的值不同。我想将两个数据框合并为一个。请看下面的例子。

In [13]: df_ver1
Out[13]: 
key  nm         0         1         2         3
bar one -0.424972  0.567020  0.276232 -1.087401
    two -0.673690  0.113648 -1.478427  0.524988
baz one  0.404705  0.577046 -1.715002 -1.039268
    two -0.370647 -1.157892 -1.344312  0.844885
foo one  1.075770 -0.109050  1.643563 -1.469388
    two  0.357021 -0.674600 -1.776904 -0.968914
qux one -1.294524  0.413738  0.276662 -0.472035
    two -0.013960 -0.362543 -0.006154 -0.923061


In [14]: df_ver2
Out[14]: 
key  nm         0         1         2         3
bar one  0.895717  0.410835 -1.413681 -1.236269
    two  0.805244  0.813850  1.607920  0.896171
baz one -1.206412  0.132003  1.024180 -0.487602
    two  2.565646 -0.827317  0.569605 -0.082240
oof one  1.431256 -0.076467  0.875906 -2.182937
    two  1.340309 -1.187678 -2.211372  0.380396
qux one -1.170299  1.130127  0.974466  0.084844
    two -0.226169 -1.436737 -2.006747  0.432390


In [15]: df_total
out[15]:
key  nm  ver            0         1         2         3
bar one ver1    -0.424972  0.567020  0.276232 -1.087401
        ver2     0.895717  0.410835 -1.413681 -1.236269
    two ver1    -0.673690  0.113648 -1.478427  0.524988
        ver2     0.805244  0.813850  1.607920  0.896171
baz one ver1     0.404705  0.577046 -1.715002 -1.039268
        ver2    -1.206412  0.132003  1.024180 -0.487602
    two ver1    -0.370647 -1.157892 -1.344312  0.844885
        ver2     2.565646 -0.827317  0.569605 -0.082240
qux one ver1    -1.294524  0.413738  0.276662 -0.472035
        ver2    -1.170299  1.130127  0.974466  0.084844
    two ver1    -0.013960 -0.362543 -0.006154 -0.923061
        ver2    -0.226169 -1.436737 -2.006747  0.432390

正如您已经看到的,两级多索引和第三级将数据帧版本指示为 ver1 或 ver2。每个值都按列排列。要记住的一件事是,在 df_ver1 中有 foo 索引,而在 df_ver2 中有 oof 索引。这些索引没有与其他数据帧匹配的索引,因此它在内部帧中连接。我希望我解释得足够好,如果您有任何问题,请告诉我。感谢您的帮助!

【问题讨论】:

    标签: python pandas dataframe concatenation multi-index


    【解决方案1】:

    取两个数据帧的索引 concat 和 sort_index 的交集,即

    idx = d1.index.intersection(d2.index)
    one = pd.concat([d1.loc[idx],d2.loc[idx]],keys=['ver1','ver2'])
    
    one.reset_index().set_index(['key','nm','level_0']).sort_index(level=['key','nm'])
    
                          0         1         2         3
    key nm  level_0                                        
    bar one ver1    -0.424972  0.567020  0.276232 -1.087401
            ver2     0.895717  0.410835 -1.413681 -1.236269
        two ver1    -0.673690  0.113648 -1.478427  0.524988
            ver2     0.805244  0.813850  1.607920  0.896171
    baz one ver1     0.404705  0.577046 -1.715002 -1.039268
            ver2    -1.206412  0.132003  1.024180 -0.487602
        two ver1    -0.370647 -1.157892 -1.344312  0.844885
            ver2     2.565646 -0.827317  0.569605 -0.082240
    qux one ver1    -1.294524  0.413738  0.276662 -0.472035
            ver2    -1.170299  1.130127  0.974466  0.084844
        two ver1    -0.013960 -0.362543 -0.006154 -0.923061
            ver2    -0.226169 -1.436737 -2.006747  0.432390
    

    【讨论】:

    • 我有一个错误,消息只显示 level_0。有什么想法吗?
    • @Kang 我没听懂你。只有level_0没有别的
    • 是的。我只是想先了解一下你写了什么。因此,idx 似乎负责查找两个 df 中的所有键值,并且一个代表在 idx 索引中连接两个 df。所以当我打印一个时,我得到两个 level=0 索引作为 ver1 和 ver2。最后一个重置索引是我没有得到的部分。是否有另一种方法可以编写最后一行,用索引重新排列数据帧?谢谢
    • df_total = one.reorder_levels(['key','nm','level_0']) 这样,它显示了我想要的级别类型,但第一个级别值是 'key'不结合。它只是切换订单。就是这样。
    猜你喜欢
    • 2020-10-21
    • 1970-01-01
    • 2023-03-25
    • 2017-06-17
    • 2022-12-17
    • 2017-06-20
    • 2018-04-13
    • 2020-08-03
    • 1970-01-01
    相关资源
    最近更新 更多