Ваш первый порт вызова должен быть документацией , который объясняет это разумно ясно:
Брошено, чтобы указать, что к массиву был обращен незаконный индекс. Индекс является либо отрицательным, либо большим или равным размеру массива.
Так, например:
int[] array = new int[5]; int boom = array[10]; // Throws the exception
Как избежать этого. ., не делайте этого. Будьте осторожны с вашими индексами массива.
Одной из проблем, с которыми иногда сталкиваются люди, является то, что массивы 1-индексируются, например
int[] array = new int[5]; // ... populate the array here ... for (int index = 1; index <= array.length; index++) { System.out.println(array[index]); }
Это пропустит первый элемент (индекс 0 ) и выдают исключение, когда индекс равен 5. Действующие индексы здесь 0-4 включительно. Правильный, идиоматический оператор
for
здесь будет:for (int index = 0; index < array.length; index++)
(Предполагается, что вы нуждаетесь в индексе, конечно. Если вы можете использовать расширенный для цикла, сделайте это.)
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```
Вы можете просто получить столбцы из forecastFor
с proj
в data
до присоединения влево, например:
forecastFor=forecastFor[forecastFor['proj'].isin(data.proj.unique())]
df=forecastFor.merge(data, on=['proj','country','date'], how='left')
ВЫХОД
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
Извините, это было просто, записав вопрос, я сразу понял ответ:
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')