#python #pandas #dataframe
Вопрос:
У меня была проблема, которую я пытался решить с помощью панд, но она беспокоит меня уже пару дней. У меня есть 2 кадра данных:
data = {'GMC1':[1, 3, 5, 5, 8, 9, 8, 13], 'Provider1':[101, 102, 103, 150, 160, 450, 567, 230]} dataframe1 = pd.DataFrame(data)
data2 = {'GMC2':[1, 5, 7, 22, 11, 13, 9, 8], 'Provider2':[101, 150, 150, 670, 567, 230, 340, np.nan]} dataframe2 = pd.DataFrame(data2)
Это немного сложно описать, но я хотел бы, чтобы возвращался фрейм данных, в котором:
- Provider1 не находится в provider2, где GMC1 и GMC2 совпадают
- Если Provider2-NaN, то считайте, что он не соответствует Provider1
Итак, для примера приведем данные:
mergeDF = pd.merge(dataframe1, dataframe2, how = 'inner', left_on = 'GMC1', right_on = 'GMC2') mergeDF = mergeDF[['GMC1', 'GMC2', 'Provider1', 'Provider2']]
GMC1 | ГКМ2 | Поставщик 1 | Поставщик 2 |
---|---|---|---|
1 | 1 | 101 | 101 |
5 | 5 | 103 | 150 |
5 | 5 | 150 | 150 |
8 | 8 | 160 | NaN |
8 | 8 | 567 | NaN |
9 | 9 | 450 | 340 |
13 | 13 | 230 | 230 |
- Для GMC = 1 я бы не хотел, чтобы что-либо возвращалось, потому что значения gmc и поставщика совпадают.
- Для GMC = 5 мне нужна только строка, где provider1 = 103, потому что есть еще одна строка, где GMC = 5, где и provider1, и provider2 имеют значение 150.
- Возвращайте строки, где GMC = 8 и 9, потому что в Provider2 нет соответствующих значений
Я попытался объединить, как указано выше, в GMC, а затем снова объединить столбцы provider1 и provider2, но я не могу получить желаемый результат. Я также попытался использовать функцию isin() с отрицанием (~), но я также не смог заставить ее работать, поэтому я немного схожу с ума…
Желаемый результат:
GMC1 GMC2 Provider1 5 5 103 8 8 160 8 8 567 9 9 450
Я надеюсь, что это имеет смысл, но я очень рад уточнить, если это необходимо.
Заранее большое спасибо за вашу помощь
Комментарии:
1. Можете ли вы поделиться желаемым результатом, который вы хотите
Ответ №1:
Слияние-это правильно, но я думаю, что вы хотите how="left"
. Затем вы можете запросить слияние:
(dataframe1.merge(dataframe2, left_on='GMC1', right_on='GMC2', how='left') .query('Provider1 != Provider2') )
Выход:
GMC1 Provider1 GMC2 Provider2 1 3 102 NaN NaN 2 5 103 5.0 150.0 4 8 160 8.0 NaN 5 9 450 9.0 340.0 6 8 567 8.0 NaN
Ответ №2:
Я думаю, вы можете запросить слияние следующим образом:
mergeDF.loc[~((mergeDF["GMC1"] == mergeDF["GMC2"]) amp; (mergeDF["Provider1"]==mergeDF["Provider2"]))]
GMC1 GMC2 Provider1 Provider2 1 5 5 103 150.0 3 8 8 160 NaN 4 8 8 567 NaN 5 9 9 450 340.0