Оставил соединение с НС - PullRequest
0 голосов
/ 16 января 2019

У меня есть следующий фрейм данных:

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

first df to join

к которому я хотел бы присоединиться:

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

second df to join

таким образом, чтобы в конце я получил:

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

expected after join

Итак, у меня есть фрейм данных (data) с функциями на разных уровнях. Существуют функции уровня проекта, функции проекта и страны, а также функции проекта, страны и даты. У меня также есть второй фрейм данных (forecastFor), который содержит некоторое значение для кортежа дата-страна-проект (здесь он назван hours). Я хочу присоединиться к этим двум, чтобы:

  • в результате у меня те же записи, что и в forecastFor, но с добавленными столбцами функций. Не должно быть никаких дополнительных записей, но записи могут быть удалены, если нет соответствия для столбца proj
  • объединение должно иметь тип inner для столбца proj - все они должны совпадать, и все несоответствующие записи не должны включаться в результат
  • совпадение для country и date должно иметь тип left (pandas удаляет записи с NA в столбцах, для которых выполняется соединение, но я все еще хочу записи с соответствием proj, даже когда country НС)

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Извините, это было просто, записав вопрос, я сразу понял ответ:

projLevelFeaturesData = data[['proj', 'feature_proj']].drop_duplicates()
countryLevelFeaturesData = data[['proj', 'country', 'feature_country']].drop_duplicates().dropna()
dateLevelFeaturesData = data[['proj', 'country', 'date', 'feature_date']].drop_duplicates().dropna()
projJoined = forecastFor.merge(projLevelFeaturesData, on=['proj'], how='inner')
countryJoined = projJoined.merge(countryLevelFeaturesData, on=['proj', 'country'], how='left')
joined = countryJoined.merge(dateLevelFeaturesData, on=['proj', 'country', 'date'], how='left')
0 голосов
/ 16 января 2019

Вы можете просто получить столбцы с forecastFor, которые имеют proj в data, до присоединения влево, как это:

forecastFor=forecastFor[forecastFor['proj'].isin(data.proj.unique())]
df=forecastFor.merge(data, on=['proj','country','date'], how='left')

OUTPUT

   proj country        date  hours  feature_proj  feature_country  \
0     A     POL  2018-07-01      1           NaN              NaN   
1     A     POL  2018-09-01      2         100.0              1.0   
2     A     POL  2018-10-01      3         100.0              1.0   
3     A     POL  2018-11-01      4         100.0              1.0   
4     A     USA  2018-09-01      5         100.0              2.0   
5     A     USA  2018-10-01      6         100.0              2.0   
6     B     POL  2018-06-01      7         106.0              3.0   
7     B     USA  2018-07-01      8         106.0              4.0   
8     B     USA  2018-08-01      9         106.0              4.0   
9     C     GER  2018-10-01     10           NaN              NaN   
10    C     POL  2018-11-01     11           NaN              NaN   

    feature_date  
0            NaN  
1         1001.0  
2         1002.0  
3         1003.0  
4         1004.0  
5         1005.0  
6         1006.0  
7         1007.0  
8         1008.0  
9            NaN  
10           NaN  
0 голосов
/ 16 января 2019
pd.merge(forecastFor, data, how='left')

приближает тебя ...

0   A   POL 2018-07-01  1   NaN NaN NaN
1   A   POL 2018-09-01  2   100.0   1.0 1001.0
2   A   POL 2018-10-01  3   100.0   1.0 1002.0
3   A   POL 2018-11-01  4   100.0   1.0 1003.0
4   A   USA 2018-09-01  5   100.0   2.0 1004.0
5   A   USA 2018-10-01  6   100.0   2.0 1005.0
6   B   POL 2018-06-01  7   106.0   3.0 1006.0
7   B   USA 2018-07-01  8   106.0   4.0 1007.0
8   B   USA 2018-08-01  9   106.0   4.0 1008.0
9   C   GER 2018-10-01  10  NaN NaN NaN
10  C   POL 2018-11-01  11  NaN NaN NaN
11  D   USA 2018-11-01  12  NaN NaN NaN```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...