Python 在第二级索引上高效地组合数据帧

Python 在第二级索引上高效地组合数据帧,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,我有两个数据帧看起来像 将熊猫作为pd导入 df1=局部数据帧([2.1,4.2,6.3,8.4,10.5],索引=[2,4,6,8,10]) df1.index.name='t' df2=pd.DataFrame(index=pd.MultiIndex.from_元组([('A','A',1),('A','A',4), ('A','b',5),('A','b',6),('b','c',7), ('B','c',9),('B','d',10),('B','d',11), ],name=('big

我有两个数据帧看起来像

将熊猫作为pd导入
df1=局部数据帧([2.1,4.2,6.3,8.4,10.5],索引=[2,4,6,8,10])
df1.index.name='t'
df2=pd.DataFrame(index=pd.MultiIndex.from_元组([('A','A',1),('A','A',4),
('A','b',5),('A','b',6),('b','c',7),
('B','c',9),('B','d',10),('B','d',11),
],name=('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
也就是说,我想把
df2
0
1
索引级别作为
df1
中的
0
1
索引级别

当然,数据帧上的循环也可以工作,但对于大型数据帧来说并不可行

编辑:
从下面的评论看来,我应该添加,索引
big
small
应该根据
t
的顺序推断
df1
中的
t

尝试提取级别值并
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)
)

尝试提取级别值并重新索引

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)
)

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



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



谢谢你的及时回复!不幸的是,这并不完全是我想要的,因为它从
df1
中删除了在
df2
中没有索引的行。你怎么知道
8
(B,c)
下,而不是在
(A,A)
下?或者
2
位于
(A,A)
下,但不是
(B,d)
?因为
t
索引列的顺序。感谢您的立即回复!不幸的是,这并不完全是我想要的,因为它从
df1
中删除了在
df2
中没有索引的行。你怎么知道
8
(B,c)
下,而不是在
(A,A)
下?或者
2
位于
(A,A)
下,但不是
(B,d)
?因为
t
索引列的顺序。