Python Pandas将两个多索引数据帧连接到一个多索引的另一个级别

2024-09-29 05:21:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我又在处理多重指数。这一次,我将合并两个具有相同类型的多索引索引和列的数据帧。但是,价值观是不同的,而且会有索引级别(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索引。这些索引没有与其他dataframe匹配的索引,因此它被连接在内部帧中。我希望我解释得足够好,如果你有任何问题请告诉我。谢谢你的帮助!在


Tags: 数据keyindffoobarbazout
1条回答
网友
1楼 · 发布于 2024-09-29 05:21:46

取两个dataframe的索引concat和sort_索引的交叉点,即

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

相关问题 更多 >