У меня 2 фрейма данных
df1
Company SKU Sales
Walmart A 100
Total A 200
Walmart B 200
Total B 300
Walmart C 400
Walmart D 500
df2
Company SKU Sales
Walmart A 400
Total B 300
Walmart C 900
Walmart F 400
Total G 500
Мне нужен результирующий фрейм данных (df2), в котором есть только записи совпадающих SKU в df1 и df2
df2
Company SKU Sales
Walmart A 400
Total B 300
Walmart C 900
Мне нужны только уникальные (Компания + SKU) значения df1 в df2
Есть ли хорошее решение для этого?






Обновлять
Вы можете использовать простую маску:
m = df2.SKU.isin(df1.SKU)
df2 = df2[m]
Вы ищете внутреннего соединения. Попробуй это:
df3 = df1.merge(df2, on=['SKU','Sales'], how='inner')
# SKU Sales
#0 A 100
#1 B 200
#2 C 300
Или это:
df3 = df1.merge(df2, on='SKU', how='inner')
# SKU Sales_x Sales_y
#0 A 100 100
#1 B 200 200
#2 C 300 300
@AhamedMoosa Я не совсем понимаю, чего вы хотите. Предлагаемое мной решение дает желаемый результат. Хорошо, извини, что ты изменил имя
Ваш обновленный ответ соответствует моей цели Спасибо. Могу ли я использовать isin для нескольких столбцов?
@AhamedMoosa Извините за поздний ответ. Вы все еще ищете ответ, как это сделать в нескольких столбцах?
Я уже нашел обходной путь для этой проблемы, я использовал ваше решение и немного импровизировал для своего варианта использования. Спасибо.
@AhamedMoosa Отлично :)
Решение 1:
# First identify the common SKU's
temp = list(set(list(df1.SKU)).intersection(set(list(df2.SKU))))
# Filter df2 using the list of common SKU's
df3 = df2[df2.SKU.isin(temp)]
print(df3)
SKU Sales
0 A 400
1 B 300
2 C 900
Решение 2. Однострочное решение
df3 = df2[df2.SKU.isin(list(df1.SKU))]
РЕДАКТИРОВАТЬ 1: Решение для обновленного вопроса (не оптимальный способ сделать это, но отвечает на ваш вопрос)
# reading data for df1
df1= pd.read_clipboard(sep='\\s+')
df1
Company SKU Sales
0 Walmart A 100
1 Total A 200
2 Walmart B 200
3 Total B 300
4 Walmart C 400
5 Walmart D 500
# reading data for df2
df2= pd.read_clipboard(sep='\\s+')
df2
Company SKU Sales
0 Walmart A 400
1 Total B 300
2 Walmart C 900
3 Walmart F 400
4 Total G 500
# Using intersect and zip to create a list of tuples matching in the data frames
temp = list(set(list(zip(df1.Company,df1.SKU))).intersection(set(list(zip(df2.Company,df2.SKU)))))
temp
[('Walmart', 'A'), ('Walmart', 'C'), ('Total', 'B')]
# Creating a helper variable in df2 to lookup in the temp list
df2["temp"] = list(zip(df2.Company,df2.SKU))
df2= df2[df2["temp"].isin(temp)]
del(df2["temp"])
df2
Company SKU Sales
0 Walmart A 400
1 Total B 300
2 Walmart C 900
Приветствуются предложения по улучшению этого кода
Привет, баран, спасибо за ответ. На всякий случай, если мне нужно пересечь несколько столбцов?
Затем вы можете перейти к Решению 1, так как temp - это список, который вы можете пересечь с другим списком.
Привет, Рам, я отредактировал свой вопрос, пожалуйста, сообщите, может ли ваше первое решение достичь этого
На мой взгляд, преобразование list() не нужно и потенциально дорого.
Полностью с тобой согласен. Спасибо!
Один из способов - выровнять индексы, а затем использовать маску.
# align indices
df1 = df1.set_index(['Company', 'SKU'])
df2 = df2.set_index(['Company', 'SKU'])
# calculate & apply mask
df2 = df2[df2.index.isin(df1.index)].reset_index()
Сброс индекса не требуется, но необходим для поднятия Company и SKU до столбцов.
Спасибо, jpp, я сделал то же самое. Я объединил столбцы компании и SKU, а затем применил маску.
Привет, Антон, спасибо за ответ. Покупка продаж - это не мой ключ. Это может быть любое значение.