Выровнять pandas фреймы данных с мультииндексом - PullRequest
0 голосов
/ 18 июня 2020

У меня есть два pandas фрейма данных 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)

1 Ответ

1 голос
/ 18 июня 2020

Вы можете создать новый индекс для желаемого уровня (2 в вашем случае) с помощью intersection, а затем выбрать строки с помощью 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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...