У меня есть следующий фрейм данных:
import pandas as pd
import numpy as np
data = pd.DataFrame({
'proj': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C'],
'country': ['POL', 'POL', 'POL', 'POL', 'USA', 'USA', 'POL', 'USA', 'USA', 'USA', 'FRA', np.NaN],
'date': ['2018-08-01', '2018-09-01', '2018-10-01', '2018-11-01', '2018-09-01', '2018-10-01', '2018-06-01', '2018-07-01', '2018-08-01', '2018-09-01', '2018-09-01', np.NaN],
'feature_proj': [100, 100, 100, 100, 100, 100, 106, 106, 106, 106, 106, 110],
'feature_country': [1, 1, 1, 1, 2, 2, 3, 4, 4, 4, 5, np.NaN],
'feature_date': [1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, np.NaN]
})
к которому я хотел бы присоединиться:
forecastFor = pd.DataFrame({
'proj': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'D'],
'country': ['POL', 'POL', 'POL', 'POL', 'USA', 'USA', 'POL', 'USA', 'USA', 'GER', 'POL', 'USA'],
'date': ['2018-07-01', '2018-09-01', '2018-10-01', '2018-11-01', '2018-09-01', '2018-10-01', '2018-06-01', '2018-07-01', '2018-08-01', '2018-10-01', '2018-11-01', '2018-11-01'],
'hours': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
})
таким образом, чтобы в конце я получил:
expected = pd.DataFrame({
'proj': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'],
'country': ['POL', 'POL', 'POL', 'POL', 'USA', 'USA', 'POL', 'USA', 'USA', 'GER', 'POL'],
'date': ['2018-07-01', '2018-09-01', '2018-10-01', '2018-11-01', '2018-09-01', '2018-10-01', '2018-06-01', '2018-07-01', '2018-08-01', '2018-10-01', '2018-11-01'],
'hours': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
'feature_proj': [100, 100, 100, 100, 100, 100, 106, 106, 106, 110, 110],
'feature_country': [1, 1, 1, 1, 2, 2, 3, 4, 4, np.NaN, np.NaN],
'feature_date': [np.NaN, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, np.NaN, np.NaN]
})
Итак, у меня есть фрейм данных (data
) с функциями на разных уровнях. Существуют функции уровня проекта, функции проекта и страны, а также функции проекта, страны и даты. У меня также есть второй фрейм данных (forecastFor
), который содержит некоторое значение для кортежа дата-страна-проект (здесь он назван hours
). Я хочу присоединиться к этим двум, чтобы:
- в результате у меня те же записи, что и в
forecastFor
, но с добавленными столбцами функций. Не должно быть никаких дополнительных записей, но записи могут быть удалены, если нет соответствия для столбца proj
- объединение должно иметь тип
inner
для столбца proj
- все они должны совпадать, и все несоответствующие записи не должны включаться в результат
- совпадение для
country
и date
должно иметь тип left
(pandas удаляет записи с NA в столбцах, для которых выполняется соединение, но я все еще хочу записи с соответствием proj
, даже когда country
НС)
Есть идеи?