在二级索引上有效地组合数据帧

时间:2021-02-04 20:59:24

标签: python pandas dataframe multi-index

我有两个数据框看起来像

AWS Console

我正在寻找一种有效的方法来组合它们,以便我得到

import pandas as pd

df1 = pd.DataFrame([2.1,4.2,6.3,8.4,10.5], index=[2,4,6,8,10])
df1.index.name = 't'

df2 = pd.DataFrame(index=pd.MultiIndex.from_tuples([('A','a',1),('A','a',4),
                           ('A','b',5),('A','b',6),('B','c',7),
                           ('B','c',9),('B','d',10),('B','d',11),
                          ], names=('big', 'small', 't')))

即我想获得 0 big small t A a 1 NaN 2 2.1 4 4.2 b 5 NaN 6 6.3 B c 7 NaN 8 8.4 9 NaN d 10 10.5 11 NaN 的索引级别 01 作为 df2 中的索引级别 01

当然,数据帧上的循环也可以工作,尽管对于大型数据帧不可行。

编辑: 从下面的评论看来,我应该添加,索引 df1big 应该根据 small 的顺序在 t 中的 df1 上推断。< /p>

2 个答案:

答案 0 :(得分:1)

尝试提取级别值和 reindex

df2['0'] = df1.reindex(df2.index.get_level_values('t'))[0].values

输出:

                 0
big small t       
A   a     1    NaN
          4    4.2
    b     5    NaN
          6    6.3
B   c     7    NaN
          9    NaN
    d     10  10.5
          11   NaN

对于 df1 中的更多列,我们只需 merge

(df2.reset_index()
    .merge(df1, on='t', how='left')
    .set_index(df2.index.names)
)

答案 1 :(得分:1)

假设您希望根据 't' 的顺序推断未知索引级别,我们可以使用其他合并,对值进行排序,然后使用 ffill 逻辑重新创建 MultiIndex (为此需要一个系列)。

res = (df2.reset_index()
          .merge(df1, on='t', how='outer')
          .set_index(df2.index.names)
          .sort_index(level='t'))

res.index = pd.MultiIndex.from_arrays(
                [pd.Series(res.index.get_level_values(i)).ffill()
                 for i in range(res.index.nlevels)],
                names=res.index.names)

print(res)

                 0
big small t       
A   a     1    NaN
          2    2.1
          4    4.2
    b     5    NaN
          6    6.3
B   c     7    NaN
          8    8.4
          9    NaN
    d     10  10.5
          11   NaN
相关问题