Pandas 将数据帧与多索引对齐

Pandas 将数据帧与多索引对齐,pandas,multi-index,Pandas,Multi Index,我有两个数据帧df1和df2,具有不同的多索引。我想根据最后一个索引级别对齐两个数据帧。较短的数据帧规则,即不在较短数据帧中的所有日期应从较长的数据帧中删除 如果我放弃前两个指数级别,我会得到我想要的结果。但是,我想保留完整的多重索引 import numpy as np import pandas as pd idx1_l1 = np.tile("provider_1", 31) idx2_l1 = np.tile("provider_2", 22) idx1_l2 = np.tile("i

我有两个数据帧
df1
df2
,具有不同的多索引。我想根据最后一个索引级别对齐两个数据帧。较短的数据帧规则,即不在较短数据帧中的所有日期应从较长的数据帧中删除

如果我放弃前两个指数级别,我会得到我想要的结果。但是,我想保留完整的多重索引

import numpy as np
import pandas as pd

idx1_l1 = np.tile("provider_1", 31)
idx2_l1 = np.tile("provider_2", 22)
idx1_l2 = np.tile("indicator_1", 31)
idx2_l2 = np.tile("indicator_2", 22)
idx1_l3 = pd.date_range(start="2020-01-01", end="2020-01-31")
idx2_l3 = pd.date_range(start="2020-01-10", end="2020-01-31")
data1 = np.random.randint(low=1, high=100, size=31)
data2 = np.random.randint(low=1, high=100, size=22)

df1 = pd.DataFrame(data=data1, index=[idx1_l1, idx1_l2, idx1_l3])
df2 = pd.DataFrame(data=data2, index=[idx2_l1, idx2_l2, idx2_l3])

df1, df2 = df1.droplevel([0, 1]).align(df2.droplevel([0, 1]), join="inner", axis=0)

您可以通过创建所需级别的新索引(本例中为2),然后使用以下选项选择行:


我喜欢得到两个索引的交集。通过将
get\u indexer
(以前从未听说过)替换为
reindex
,可以进一步简化代码
df1=df1.reindex(index=idx,level=-1)
df2=df2.reindex(index=idx,level=-1)
@Andi:谢谢你的评论,这确实简单多了。有时你看不到显而易见的:)如果我使用两个以上的数据帧,什么是python方式?将
idx
df3.index.get_level_值(2)
进行交叉,可能是在循环中?是的,循环肯定会工作,但是,我想知道这是否被视为“python”;-)
idx = df1.index.get_level_values(2).intersection(df2.index.get_level_values(2))
df1 = df1.iloc[df1.index.get_level_values(2).get_indexer(idx)]
df2 = df2.iloc[df2.index.get_level_values(2).get_indexer(idx)]