Умножение двух фреймов данных, основанных на столбцах и пропущенных строках, не удовлетворяет условию - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть два фрейма данных, первый имеет два индекса (страна и продукт) и значение связанной переменной.У меня 20 стран и 7 товаров.Обратите внимание, что в этом фрейме данных могут быть две строки с одной и той же страной и продуктом, поскольку каждая строка соответствует отдельному наблюдению.

df1

                                        value
Country     Product 
Guatemala   Hydro                       259.420233
            Oil                         4.211656
            Oil                         341.550360
            Coal, peat and oil shale    4.311316
            Coal, peat and oil shale    NaN
            Hydro                       24.433527
Colombia    Oil                         10
            Coal, peat and oil shale    4.311316

.
.
.

Второй кадр данных точно, как показано ниже

df2

                                        mult
Country     Product 
Argentina   Natural gas                 1
Colombia    Oil                         161
Mexico      Coal, peat and oil shale    9
            Natural gas                 2

Я пытаюсь умножить две данныекадры.Строки конечного фрейма данных должны быть равны первому фрейму данных.Если в df2 нет доступных значений для умножения строки в df1 (например, Гватемала / Нефть), значение в df1 должно быть неизменным.

Я очень ценю вашу помощь.Я перепробовал много вариантов и любых работ.

1 Ответ

0 голосов
/ 06 февраля 2019

Во-первых, не стоит индексировать столбцы, которые будут генерировать дубликаты.Если вы действительно жаждете нарушить эту лучшую практику, вы все равно можете следовать моим инструкциям ниже и затем изменить его на исходный индекс.

import pandas as pd
import numpy as np
df1 = df1.reset_index(drop = False)
df2 = df2.reset_index(drop = False)

df3 = df1.merge(df2, on = [‘product’, ‘country’], how = ‘left’)

df3[ ‘result’] = np.where(df3.mult.isnull(), df3.value, df3.value * df3.mult)

#now, disrespect all that is holy
df3 = df3.set_index([‘product’, ‘country])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...