【问题标题】:Align pandas dataframes with multiindex将 pandas 数据框与多索引对齐
【发布时间】:2020-10-08 04:25:49
【问题描述】:

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

如果我要删除前两个索引级别,我会得到我正在寻找的结果。但是,我想保留完整的多索引。

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)

【问题讨论】:

    标签: pandas multi-index


    【解决方案1】:

    您可以通过intersection为所需级别(在您的情况下为2)创建新索引,然后选择带有get_indexer的行:

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

    【讨论】:

    • 我喜欢获得两个索引交集的想法。您可以通过将get_indexer(以前从未听说过)替换为reindex 来进一步简化代码。 df1 = df1.reindex(index=idx, level=-1)df2 = df2.reindex(index=idx, level=-1)
    • @Andi:感谢您的评论,这确实要简单得多。有时你看不到明显的:)
    • 如果我要使用两个以上的数据帧,那么 Python 的方式会是什么?
    • 使idxdf3.index.get_level_values(2) 等相交,可能在一个循环中?
    • 是的,循环肯定会起作用,但是,我想知道这是否被视为“pythonic”? ;-)
    猜你喜欢
    • 2014-12-09
    • 2014-02-28
    • 2017-06-17
    • 2020-10-22
    • 2012-11-09
    • 2021-02-07
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多